问题描述
使用sprintf()函数出现的‘诡异’现象,如下:
echo sprintf('%.1f',4.65); //输出 4.7
echo sprintf('%.1f',4.85); //输出 4.8
原因分析:
十进制浮点数在计算机内部也是用二进制表示的,双精度浮点数下使用 64 位(8字节) 来存储一个浮点数,其中小数位有53位。53位之后的被舍去了,这样就变成有限位,但是也带来了精度问题。
把53位小数展示出来,如下
printf('%.53f',4.65); // 输出 4.65000000000000035527136788005009293556213378906250000
printf('%.53f',4.85); // 输出 4.84999999999999964472863211994990706443786621093750000
一目了然,4.65 其实是4.650000… ,4.85是4.849999…
所以四舍五入后就出现了前面的‘诡异’问题。
解决方案:
用round() 函数 替代 sprintf() 函数。
参考文章:php中sprintf使用bug
文章讨论了在PHP中使用sprintf函数处理浮点数时出现的精度误差,这源于十进制浮点数在二进制下的表示限制。4.65和4.85在二进制下并非精确值,导致四舍五入后的输出不预期。解决方案是使用round()函数来确保正确四舍五入。
290

被折叠的 条评论
为什么被折叠?



