PHP浮点数计算存在一些常见问题,主要有:
1. 精度丢失
PHP中浮点数的精度为53位,超出范围会导致精度丢失。
$a = 0.1; $b = 0.2; $c = $a + $b; // $c = 0.30000000000000004
解决方法:不要直接进行货币计算,提前乘以100或其他scale再进行计算。
2. 非整数结果
二进制无法精确表示所有小数,会产生微小误差。
$a = 1.23456; $b = 1.2; $c = $a - $b; // $c = 0.0456000000000000002
解决方法:根据精度要求进行四舍五入或格式化输出。
3. 无限和NaN
PHP支持INF(无限大)和NAN(不是数字)的值。
$inf = acos(1.1); // $inf = INF $nan = acos(2); // $nan = NAN is_infinite($inf); // true is_nan($nan); // true
解决方法:在计算前检查输入值,避免产生无限和NaN的结果。
4. 对比操作
由于精度丢失,两个看似相等的浮点数使用相等运算符比较可能返回false。
$a = 1.23456; $b = 1.23457; $c = 1.23456; $a == $b; // false $a == $c; // false
解决方法:
– 使用一个small值进行容差比较
– 转为字符串进行比较
– 只比较关键精度范围内的值
5. 四舍五入
round()函数的四舍五入规则与人的常识不同。
round(1.5); // 2 round(2.5); // 2 round(-1.5); // -2 round(-2.5); // -2
解决方法:使用ceil()和floor()函数,或指定round()的第二个参数为 round()次舍入位。
以上就是PHP浮点数计算中常见的几个问题。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录