提问人:AzDesign 提问时间:2/7/2022 最后编辑:AzDesign 更新时间:2/8/2022 访问量:54
如何在 php 中处理浮点数时获得一致的结果
How to get consistent result while dealing with float in php
问:
代码如下:
$nums = ['3','3','5.26','3','9.11','9.11','9.11','9.11','9.11','9.11','9.11','9.11','9.11','1.25','1.25','1.25'];
$total = 0;
$accuracy = 0.00001;
foreach($nums as $num) {
$total += floatval($num);
}
var_dump($total); //float(100)
var_dump($total == 100); //bool(false)
var_dump(abs($total - 100)); //float(1.4210854715202E-14)
var_dump(abs($total - 100) < $accuracy); //bool(false)
$nums = ['3','3','5.23','3','13.67','13.67','13.67','13.67','13.67','13.67','1.25','1.25','1.25'];
$total = 0;
foreach($nums as $num) {
$total += floatval($num);
}
var_dump($total); //float(100)
var_dump($total == 100); //bool(false)
var_dump(abs($total - 100)); //float(0)
var_dump(abs($total - 100) < $accuracy); //bool(true)
如上图所示,有 2 组不同的数字。两者的总和都是 100。但是在处理浮点数时,结果可能不一致。
这是我的用例:
考试可以有很多问题,每个问题可以有不同的分数,但只有当分数总和正好为 100 时,考试才能激活。
一个考试可以处于活动状态,另一个考试不能。而且我设置了很多数字,PHP 有 50:50 的机会将它们视为“正好 100”。使用 float 持续获得 100 总和的最佳方法是什么?
答: 暂无答案
评论
round($num * 100) / 100
round($num * 1000) / 1000
pow
round($num * pow(10,$dp)) / pow(10,$dp)
echo
$b = abs($total - 100) < $accuracy; echo "$b <br>";
<?php
?>