Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 十进制浮点数到二进制数和二进制数的转换_Binary_Floating Point_Decimal_Precision_Floating Accuracy - Fatal编程技术网

Binary 十进制浮点数到二进制数和二进制数的转换

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)

简而言之,我的问题是,为什么浮点中的舍入误差只在计算之后出现,而不是在存储文字时出现

我的意思是- 我知道在从十进制转换为二进制再转换回二进制时,由于浮点中的舍入错误而产生的问题

例如,在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)都不能满足要求。

但是如果我打印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。