我将一些数据存储在数据库中,然后用光标读取这些数据。所有数据都是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。
提前谢谢!
答案 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);