簡體   English   中英

PHP返回錯誤的值

[英]php return wrong value

我試圖計算這在php中:

echo (int)((0.1 + 0.7) * 20);

為什么會返回15

預期結果: 16

實際結果 :15

來自doc: http//php.net/manual/en/language.types.float.php

浮點數的精度有限。 盡管它取決於系統,但PHP通常使用IEEE 754雙精度格式,由於舍入為1.11e-16的順序,它將提供最大的相對誤差。 非基本算術運算可能會產生較大的錯誤,並且,當然,在合並多個運算時必須考慮錯誤傳播。

此外, 在底數10中可精確表示為浮點數的有理數(如0.1或0.7)在底數2中沒有作為浮點數的精確表示,內部使用,無論尾數的大小如何 因此,如果不損失一點點精度,就不能將它們轉換為內部二進制副本。 這可能導致混亂的結果:例如,floor((0.1 + 0.7)* 10)通常返回7而不是預期的8,因為內部表示形式類似於7.9999999999999991118 ....

您可以使用BC數學函數

$precision = 2;
echo bcmul( bcadd("0.1","0.7",$precision) ,"20",$precision); // 16.00

你需要

intval ((0.1 + 0.7) * 20);

抱歉,這是錯誤的,但這是一種解決方法:

$n= ( (0.1 + 0.7) * 20);  //=16
$n2 = intval ($n."");     // cast it to string, then to int.
echo $n2;

這是由於PHP將小數轉換為等效的二進制數引起的,這導致精度下降。

如果需要較高的准確性,請改用GMPbcmath庫。

類型轉換結果導致錯誤的數字echo ((0.1 + 0.7) * 20); 應該給16

看起來像是舍入錯誤

0.1 + 0.7 = 0.7999999999

0.799999999 * 20 = 15.9999998

int(15.9999998)= 15

您必須舍入結果。

echo (int)(((0.1*10 + 0.7*10)/10) * 20);

首先,您需要除去小數點然后執行操作,否則不要打字

echo (0.1+0.7)*20;

您嘗試過這種方法嗎?

<?php
$value = (0.1+0.7)*20;
echo $value;
?>

我的結果是16

請閱讀有關發泡點編號的PHP文檔 如文檔中所述,

例如,floor((0.1 + 0.7)* 10)通常將返回7而不是預期的8。

使用浮點數時,請使用BC Math獲得正確的結果。

使用圓形

echo round((0.1 + 0.7) * 20);

產量

16

更准確地說:

printf("%1\$.20f", 0.7); // output: 0.69999999999999995559
printf("%1\$.20f", 0.1); // output: 0.10000000000000000555
printf("%1\$.20f", (0.10000000000000000555+0.69999999999999995559)*20); // output: 15.99999999999999822364

因此,當您將最后一個數字轉換為int時:

echo (int)15.99999999999999822364; // output: 15

暫無
暫無

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

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