2

我将一些数据存储在数据库中,然后用游标读取这些数据。所有数据均为 56.45 , 3.04, 0.03 类型,所以小数点后有两位数。现在我想对它们求和,但这似乎并不容易......我得到这些数字c.getDouble(3)然后我将它添加到 sum 变量中,如:

sum+= c.getDouble(4) * multi

multi 是 1 到 100 之间的整数。现在我的问题是,在得到 sum 变量后,我得到一个数字,例如:59.51999999999999999。我没有发布代码,但是除了string.valueOf使数字出现在我的小部件上之外,没有任何转换。所以有人经历过吗?据我计算,它应该是 59.52,但我得到的数字是 99999……为什么会这样?(有趣的是,aMath.round()不起作用,即使我设置 (sum)*100 / 100 ,我也会得到 59.0 ..提前致谢!

4

2 回答 2

9

你的数字对你来说是十进制的,但对计算机来说是二进制的。

在十进制和二进制中,某些分数无法精确表示。

例如 1/3 不能用十进制精确表示。您只能用 0.3333333333 之类的值来近似它。但是如果你尝试做 3 * 0.3333333333,你最终会得到 0.9999999999 而不是 1.0000000000。

在二进制中,您有相同的问题,但分数不同。

因此,有时当您从十进制转换为二进制并再次转换回来时(计算机基本上必须为您执行浮点运算),即使所有数字在十进制中都是非常精确的,您也会在精度上出现小错误。当计算机使用它们的二进制近似等效项时,会引入近似值,它们会导致小错误。

这实际上是编程中非常常见的问题。有关更多详细信息,请参阅每个计算机科学家应该了解的浮点运算知识

于 2012-06-16T17:09:02.877 回答
3

其他方法,您可以将 sum 变量定义为double,然后您可以设置NumberFormatsum 变量。

例子:

double sum = 21.2015;
NumberFormat formatter = new DecimalFormat("#.##");
formatter.format(sum);
于 2012-06-16T17:11:41.190 回答