<?php
$num1 = 0.1;
$num2 = 0.2;
$num3 = 0.3;
$sum = $num1 + $num2;
var_dump($sum - $num3 ); //两个值不等;
if ($sum == $num3) {
echo "两个浮点数相加等于0.3";
} else {
echo "两个浮点数相加不等于0.3";
echo "实际结果: " . $sum;
}
echo "<hr>";
//处理的方法1.使用sprintf对数值进行格式化处理,将他们转化成相同位数的字符串再进行求和运算
$num1 = 0.1;
$num2 = 0.2;
$num3 = 0.3;
$sum = sprintf("%.2f",$num1 + $num2);
var_dump($sum ); //两个值不等;
if ($sum == $num3) {
echo "两个浮点数相加等于0.3";
} else {
echo "两个浮点数相加不等于0.3";
echo "实际结果: " . $sum;
}
echo "<hr>";
//累计相加,让$sum保留两位,字符串;
$arr = [0.1,0.2,0.3];
$sum = 0;
foreach ($arr as $v) {
$sum += $v;
$sum = sprintf("%.2f",$sum);
}
var_dump($sum - 0.6);//结果等于0
echo "<hr>";
//处理方法2.BC数学库,它可以提供更高精度的数学计算。示例代码如下:
// 本质上是两个字符串进行相加,结果返回一个字符串
$arr = [0.1,0.2,0.3];
$sum = 0;
foreach ($arr as $v) {
$sum = bcadd($sum,$v,2); //2表示结果保留的小数点位数,返回字符串类型
}
var_dump($sum,0.6);
echo "<br>";
浮点数求和精度问题导致的错误处理
最新推荐文章于 2024-11-05 17:05:36 发布