简而言之,我的问题是,为什么 float 中的舍入误差仅在计算后出现,而不是在存储文字时出现?
我的意思是 - 我知道在十进制与二进制相互转换时由于 float 的舍入误差而出现的问题。
例如,在 Java 中:
double a = 10.567;
double b = 2.16;
double c = a * b;
c 然后存储值 22.824720000000003,而不是 22.82472。
这是因为double类型的有限二进制数无法准确存储结果22.82472。 但是,10.567 和 2.16(即 a 和 b)也不能。
但是如果我打印 a 和 b 的值,它们会被准确地打印出来,没有任何舍入误差。为什么这里没有显示舍入误差?
这是否意味着浮点文字的表示与浮点计算结果的表示有所不同?
最佳答案
文字转换中存在舍入误差,它恰好对您隐藏。 10.567 无法用二进制表示,因此它会四舍五入到最接近的可表示的 double
值,即
10.56700000000000017053025658242404460906982421875
但是,该算法不是打印确切的值(这会相当烦人),而是打印尽可能少的数字,这样如果将其转换回二进制,它将给出相同的值(在本例中为“10.567”) .
事实证明,对于double
,您可以对最多 15 位的任何小数执行此操作,请参阅 http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/ .
关于binary - 十进制 float 与二进制的相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39011905/