【PHP 中sprintf()函数的坑】

问题描述

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值