问题描述
使用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