我将一些数据存储在数据库中,然后使用游标读取这些数据。所有数据均为 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()
不起作用,即使我设置 (sum)*100 / 100,我也会得到 59.0..
提前致谢!
您的数字对您而言以十进制表示,但对计算机而言以二进制表示。
无论是十进制还是二进制,有些分数都无法精确表示。
例如,1/3 无法用十进制精确表示。您只需使用 0.3333333333 之类的值来近似即可。但如果你尝试执行 3 * 0.3333333333,你最终会得到 0.9999999999 而不是 1.0000000000。
在二进制中,你有同样的问题,但分数不同。
因此,有时当您从十进制转换为二进制并再次转换回来时(这是计算机基本上必须为您执行浮点运算的操作),即使所有数字在十进制中都是完全精确的,您也会在精度上出现小错误。当计算机使用其二进制近似等价物时,会引入近似值并导致小错误。
这实际上是编程中非常常见的问题。有关更多详细信息,请参阅每个计算机科学家都应该了解的浮点运算知识 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)