浮点数求和精度问题导致的错误处理

<?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>";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值