簡體   English   中英

PHP四舍五入時精度不正確

[英]PHP incorrect precision while rounding off number

我需要舍入一些數字並獲得修改價值。

我試過了:

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

但我有:

12.46
-0.0040000000000013

而我的預期結果是:

12.46
-0.004

怎么了?
我如何獲得所需的東西?

嘗試下面的代碼。 它會給您預期的結果。 我已將差額四舍五入。

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

鍵盤

浮點值的精度存在問題。 請參閱本文以供參考- 默認情況下,PHP浮點精度不正確

如果需要精確的精度,可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM