我在做一个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));
}
});
}
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