十进制浮点数与二进制的相互转换
Conversion of decimal floating point numbers to binary and back
我的问题,简而言之,为什么浮点数的舍入错误只出现在计算之后而不是用于存储文字?
我的意思是——
我知道从十进制转换为二进制并返回时由于浮点数舍入错误而出现的问题。
例如,在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 的值,它们会被准确地打印出来,没有任何舍入误差。为什么此处不显示舍入误差?
这是否意味着 float 文字的表示与 float 计算结果的表示有些不同?
字面值转换有舍入误差,正好瞒着你。 10.567 无法用二进制表示,因此它四舍五入到最接近的可表示 double
值,即
10.56700000000000017053025658242404460906982421875
然而,该算法并没有打印出确切的值(这会很烦人),而是打印出尽可能少的数字,这样如果将其转换回二进制,它会给出相同的值(在本例中为“10.567 ").
事实证明,对于 double
s,您可以对最多 15 位的任何小数执行此操作,请参阅 http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。
我的问题,简而言之,为什么浮点数的舍入错误只出现在计算之后而不是用于存储文字?
我的意思是—— 我知道从十进制转换为二进制并返回时由于浮点数舍入错误而出现的问题。
例如,在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 的值,它们会被准确地打印出来,没有任何舍入误差。为什么此处不显示舍入误差?
这是否意味着 float 文字的表示与 float 计算结果的表示有些不同?
字面值转换有舍入误差,正好瞒着你。 10.567 无法用二进制表示,因此它四舍五入到最接近的可表示 double
值,即
10.56700000000000017053025658242404460906982421875
然而,该算法并没有打印出确切的值(这会很烦人),而是打印出尽可能少的数字,这样如果将其转换回二进制,它会给出相同的值(在本例中为“10.567 ").
事实证明,对于 double
s,您可以对最多 15 位的任何小数执行此操作,请参阅 http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。