我的问题,简而言之,为什么浮点数中的舍入误差仅在计算后显示而不是存储文字?
我的意思是 - 我知道由于从十进制转换为二进制并返回时浮点数的舍入错误而产生的问题。
例如,在Java中:
double a = 10.567;
double b = 2.16;
double c = a * b;
然后c存储值22.824720000000003,而不是22.82472。
这是因为结果22.82472无法准确存储在double类型的有限二进制数字中。 但是,10.567和2.16(即a和b)都不能。
但是如果我打印a和b的值,它们会被打印出来,没有任何舍入错误。为什么舍入错误不会显示在这里?
这是否意味着浮点文字的表示与浮点计算结果的表示有某种不同?
答案 0 :(得分:5)
文字转换中存在舍入错误,它恰好对您隐藏。 10.567不能用二进制表示,所以它舍入到最接近的可表示double
值
10.56700000000000017053025658242404460906982421875
然而,算法不是打印确切的值(这将是相当烦人的),而是打印尽可能少的数字,这样如果它被转换回二进制,它将给出相同的值(在这种情况下是“10.567”)
事实证明,对于double
s,您可以为最多15位数的任何小数执行此操作,请参阅http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。