我需要对一些数字进行舍入并修改值。
我试过了:
$Num=12.456;
$RoundDiff=$Num-round($Num,2);
$Num=round($Num,2);
echo $Num.'<br/>'.$RoundDiff;
但我得到了:
12.46
-0.0040000000000013
虽然我的预期结果是:
12.46
-0.004
出了什么问题?
我怎样才能得到我需要的东西?
答案 0 :(得分:2)
尝试以下代码。它会给你预期的结果。我刚刚完成了差异。
$Num = 12.456;
$RoundDiff = $Num-round($Num,2);
$Num = round($Num,2);
echo $Num.'<br/>'.round($RoundDiff,3);
浮点值的精度存在问题。请参阅此文章以供参考 - The PHP floating point precision is wrong by default
因为在内部,计算机使用格式(二进制浮点) 它不能准确地表示0.1,0.2或0.3之类的数字。
编译或解释代码时,您的“0.1”已经存在 四舍五入到该格式的最接近的数字,这导致一个小的 甚至在计算发生之前舍入错误。 - 浮点 导
另一个参考:
鉴于(正常)IEEE 754的隐式精度加倍 精度数略小于16位3,这是一个 严重的矫枉过正。换句话说,尾数由...组成 52位加1个隐含位,100位十进制数字最多可以携带 100 * log2(10)= ~332位信息,大约6倍以上。
鉴于此,我建议将默认精度更改为17(而 精度略低于16,第17位是必要的,因为 当它很低时,第一个十进制数字携带很少的信息。 - 源
BCMATH: 根据评论中的要求
$a = 12.456;
$b = round($a,2);
echo 'a ='.$a.'<br>';
echo 'b ='.$b.'<br>';
echo bcsub($a, $b, 3);