PHP舍入数字时精度不正确

时间:2018-02-20 13:23:57

标签: php rounding

我需要对一些数字进行舍入并修改值。

我试过了:

$Num=12.456;
$RoundDiff=$Num-round($Num,2);
$Num=round($Num,2);
echo $Num.'<br/>'.$RoundDiff;

但我得到了:

12.46
-0.0040000000000013

虽然我的预期结果是:

12.46
-0.004

出了什么问题?
我怎样才能得到我需要的东西?

1 个答案:

答案 0 :(得分:2)

尝试以下代码。它会给你预期的结果。我刚刚完成了差异。

$Num       = 12.456;
$RoundDiff = $Num-round($Num,2);
$Num       = round($Num,2);
echo $Num.'<br/>'.round($RoundDiff,3);

CodePad

浮点值的精度存在问题。请参阅此文章以供参考 - The PHP floating point precision is wrong by default

如果您想要精确的精确度,可以使用bcmathgmp

  

因为在内部,计算机使用格式(二进制浮点)   它不能准确地表示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);