当前位置: 首页 > 知识库问答 >
问题:

为什么除以零得到9.223372e+18?

齐奕
2023-03-14

我在做一个Android计算器,除以零得到9.223372e+18。为什么不显示NaN或Crash?我认为它的结果是9.223372e+18,因为这是可能的最大的double值,因为我使用了double数据类型除以零。既然这会让用户感到困惑,我该如何绕过这个问题呢?

嗨,伙计们,谢谢你们的回复。我很感激。我在下面发布了我的代码。

public class CFM extends ActionBarActivity {
Double cfm, ac, volume;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cfm);

            EditText e1 = (EditText) findViewById(R.id.editText1);
            EditText e2 = (EditText) findViewById(R.id.editText2);
            TextView t1 = (TextView) findViewById(R.id.editText3);
            t1.setEnabled(false);
            t1.setFocusable(false);

            e1.addTextChangedListener(new TextWatcher() {

                public void afterTextChanged(Editable s) {
                }

                public void beforeTextChanged(CharSequence s, int start,
                                              int count, int after) {
                }

                public void onTextChanged(CharSequence s, int start,
                                          int before, int count) {
                    EditText e1 = (EditText)findViewById(R.id.editText1);
                    EditText e2 = (EditText)findViewById(R.id.editText2);
                    volume = Double.parseDouble(e1.getText().toString());
                    cfm = Double.parseDouble(e2.getText().toString());
                    TextView t1 = (TextView) findViewById(R.id.editText3);
                    ac = cfm * 60 / volume;
                    t1.setText(Double.toString((double) Math.round(ac * 100) / 100));
                }
            });


            e2.addTextChangedListener(new TextWatcher() {

                public void afterTextChanged(Editable s) {
                }

                public void beforeTextChanged(CharSequence s, int start,
                                              int count, int after) {
                }

                public void onTextChanged(CharSequence s, int start,
                                          int before, int count) {
                    EditText e1 = (EditText)findViewById(R.id.editText1);
                    EditText e2 = (EditText)findViewById(R.id.editText2);
                    volume = Double.parseDouble(e1.getText().toString());
                    cfm = Double.parseDouble(e2.getText().toString());
                    TextView t1 = (TextView) findViewById(R.id.editText3);
                    ac = cfm * 60 / volume;
                    t1.setText(Double.toString((double) Math.round(ac * 100) / 100));
                }
            });

}

共有1个答案

黄景胜
2023-03-14

9223372036854775807(大致为9.223372e+18)是可能的最大long值。如果您有一个long类型的变量,那么我可以从除以零中看出这一点。例如,下面的代码打印9223372036854775807

long a = 1;
a /= 0.0; 
System.out.println(a);

除以时,首先转换为,结果是。任何正的double除以0.0得到double.positive_infinity,因此1/0.0就是double.positive_infinity。由于a具有long类型,因此将其转换回long,从而提供尽可能大的long值。

但是,我们需要查看您的代码才能理解为什么您有long类型的变量。

编辑

看过您的代码后,我现在意识到问题不是long类型的变量,而是您对math.round的使用。其定义如下:

返回与参数最接近的长值,并将绑定四舍五入。

String result = Double.isInfinite(ac) || Double.isNaN(ac) ? "Error"
            : new BigDecimal(ac).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
t1.setText(result);
 类似资料:
  • 在我的流中,我有一条待处理的消息: 不可能(零),但仍然。。我读到了新消息: 新消息不是空的,但是如果我读消息-两者都是(nil) 为什么?

  • 问题内容: 为什么这段代码没有抛出?看一看: 我不知道! 问题答案: 您为什么不能自己检查一下并抛出异常(如果您要的话)。

  • 为什么结果是: =NaN =无穷大 我知道或除法有一点不同。我对得到的NaN非常满意,因为当某物除以零时,结果并不是定义的。但是为什么他们定义大于零除以零的结果是不独立呢?这和他们用来执行浮点除法的方法有关系吗?

  • 问题内容: 为什么下面的Java代码 打印’Infinity’且未定义。这在数学上不是错吗? 问题答案: 在数学中,有许多支持算术的不同结构。最突出的数字(例如自然数,整数和实数)不包括无穷大。在那些系统中,不支持除以零。 其他系统的确包含至少一个无穷大。参见,例如,真实的投影线。它确实允许被零除。 只有一种方法可以知道在特定系统中数学定义或未定义的内容-研究该系统。 类似地,操作是可交换的(a

  • 问题内容: 当我在Python中进行浮点除法时,如果除以零,则会出现异常: 我真的很想得到或取而代之(因为或会正确传播到计算的其余部分,而不会杀死我的程序)。 我怎样才能做到这一点? 问题答案: 实现此行为的最简单方法是使用而不是Python默认类型: 当然,这需要NumPy。您可以用来微调错误处理。

  • 问题内容: 为什么当我这样做: 我得到0,但是当我得到 我有价值吗? 我本来希望更高的精度除法返回更高的精度结果,为什么不是这种情况呢? 问题答案: 发生这种情况的原因是,对于数学运算,使用http://msdn.microsoft.com/zh- cn/library/ms190476.aspx#division中 找到的规则来计算得出的精度和小数位数 操作 e1 / e2 结果精度 p1-s1