Jim*_*Jim 5 floating-point perl printf rounding
有人可以解释为什么这里的行为存在差异吗?
perl -E 'say sprintf("%.2f",5.555);'
5.55
perl -E 'say sprintf("%.2f",0.555);'
0.56
Run Code Online (Sandbox Code Playgroud)
sprintf()
如果以下数字是5或更大,我已经阅读了这些数据.那么为什么在第二种情况下它不能达到0.56呢?
最接近的IEEE 754 64位二进制浮点数为0.555是0.55500000000000004884981308350688777863979339599609375.它略微接近0.56而不是0.55.
最接近的IEEE 754 64位二进制浮点数为5.555是5.55499999999999971578290569595992565155029296875.它略微接近5.55而不是5.56.
在每种情况下,输出都是最接近的十进制数,其中包含内部数字实际值的2位小数.
正如Pascal Cuoq在评论中所说,0.555位于binade [0.5 ... 1],其中可表示的浮点数由2 -53分隔.相比之下,5.555位于binade [4 ... 8]中,其中可表示的浮点数由2 -50分隔.这就是0.555和5.555的小数部分不同的原因.
因为printf舍入值,只需尝试:
perl -e 'printf("%.25f", 5.555)'
Run Code Online (Sandbox Code Playgroud)
得到:
5.5549999999999997157829057
Run Code Online (Sandbox Code Playgroud)
四舍五入至5.55
与printf('%.2f', 5.55)
和
perl -e 'printf("%.25f", 0.555)'
Run Code Online (Sandbox Code Playgroud)
给
0.5550000000000000488498131
Run Code Online (Sandbox Code Playgroud)
四舍五入至0.56
与printf('%.2f', 0.55)