Binary 十进制浮点数到二进制数和二进制数的转换
简而言之,我的问题是,为什么浮点中的舍入误差只在计算之后出现,而不是在存储文字时出现 我的意思是- 我知道在从十进制转换为二进制再转换回二进制时,由于浮点中的舍入错误而产生的问题 例如,在Java中:Binary 十进制浮点数到二进制数和二进制数的转换,binary,floating-point,decimal,precision,floating-accuracy,Binary,Floating Point,Decimal,Precision,Floating Accuracy,简而言之,我的问题是,为什么浮点中的舍入误差只在计算之后出现,而不是在存储文字时出现 我的意思是- 我知道在从十进制转换为二进制再转换回二进制时,由于浮点中的舍入错误而产生的问题 例如,在Java中: double a = 10.567; double b = 2.16; double c = a * b; c然后存储值22.8247200000000003,而不是22.82472 这是因为结果22.82472不能准确地存储在双精度类型的有限二进制数字中但是,10.567和2.16(即a和b)
double a = 10.567;
double b = 2.16;
double c = a * b;
c然后存储值22.8247200000000003,而不是22.82472
这是因为结果22.82472不能准确地存储在双精度类型的有限二进制数字中但是,10.567和2.16(即a和b)都不能满足要求。
但是如果我打印a和b的值,它们会精确地打印出来,没有任何舍入误差。为什么舍入误差不显示在这里
这是否意味着浮点文字的表示与浮点计算结果的表示有所不同?在文字的转换过程中存在舍入错误,只是碰巧对您隐藏了它。10.567不能用二进制表示,因此它取而代之的是最接近的可表示的
double
值,即
10.567000000000017053025658242404460906982421875
然而,该算法并没有打印精确的值(这会很烦人),而是打印尽可能少的数字,这样,如果将其转换回二进制,它将给出相同的值(在本例中为“10.567”)
事实证明,对于
double
s,您可以对任何不超过15位的十进制数执行此操作,请参见。格式是输出的四舍五入。例如,在C中,C.ToString()
将返回22.82472
当C.ToString(“R”)
(“R”
强制.Net返回所有位而不进行任何取整)将返回22.8247200000000003
@DmitryBychenko我尝试在Java中将C格式化为字符串时,它仍然返回22.82472000000000003。