Android编号格式不知何故错了,而不是3.5我得到3.499999999,为什么?

时间:2012-06-16 17:01:26

标签: android numbers format rounding

我将一些数据存储在数据库中,然后用光标读取这些数据。所有数据都是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得到那个数字......为什么会这样? (有趣的是,Math.round()不起作用,即使设置(总和)* 100/100,我也得到59.0。 提前谢谢!

2 个答案:

答案 0 :(得分:9)

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

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

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

在二进制文件中,你有同样的问题,但是有不同的分数。

因此,有时当你从十进制转换为二进制并再次返回时(这是计算机基本上必须为你做浮点运算),即使所有数字在十进制中都非常精确,你也会得到很小的精度误差。 。当计算机使用它们的二进制近似值时,会引入近似值并导致小错误。

这实际上是编程中非常常见的问题。有关详细信息,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:2)

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

示例:

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