所以当我在 Java 中使用 Doubles 进行加法或减法时,它会给我带来奇怪的结果。以下是一些:
如果我添加 0.0 + 5.1
,它会给我 5.1
。没错。
如果我添加 5.1 + 0.1
,它会给我 5.199999999999
(重复 9
的数量可能会关闭)。错了。
如果我减去 4.8 - 0.4
,它会得到 4.39999999999995
(同样,重复的 9
可能会关闭)。错了。
起初我以为这只是用十进制值添加 double 的问题,但我错了。以下工作正常:
5.1 + 0.2 = 5.3
5.1 - 0.3 = 4.8
现在,添加的第一个数字是保存为变量的 double ,尽管第二个变量从 JTextField
中获取文本。例如:
//doubleNum = 5.1 RIGHT HERE
//The textfield has only a "0.1" in it.
doubleNum += Double.parseDouble(textField.getText());
//doubleNum = 5.199999999999999
最佳答案
在 Java 中,double
值为 IEEE floating point numbers .除非它们是 2 的幂(或 2 的幂之和,例如 1/8 + 1/4 = 3/8),否则即使它们具有很高的精度,也无法精确表示。一些浮点运算会加重这些 float 中存在的舍入误差。在上述情况下,浮点错误已经严重到足以显示在输出中。
无论是从 JTextField
解析字符串还是指定 double
文字,数字的来源是什么都无关紧要——问题在于继承浮点表示。
解决方法:
如果你知道你只有这么多小数点,那就用整数 算术,然后转换为小数:
(double) (51 + 1) / 10 (double) (48 - 4) / 10
如果你必须使用
double
,你可以减少浮点错误 与 Kahan Summation Algorithm .
关于java - 加减 double 会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625556/