PHP浮点数的几个常见问题详解

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浮点数计算中常见的几个问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论