Android 数字格式不知何故是错误的,而不是 3.5,我得到 3.499999999,为什么



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

sum+= c.getDouble(4) * multi

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

您的数字以十进制表示,但对计算机来说是二进制的。

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

例如,1/3 不能精确地用十进制表示。您只能用 0.3333333333 之类的东西来近似它。 但是,如果您尝试执行 3 * 0.33333333333,则最终会得到 0.99999999999 而不是 1.00000000000。

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

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

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

另一种方法是,您可以将 sum 变量定义为 double,然后可以为 sum 变量设置NumberFormat

例:

double sum = 21.2015;
NumberFormat formatter = new DecimalFormat("#.##");
formatter.format(sum);

最新更新