[英]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;
類型轉換結果導致錯誤的數字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
更准確地說:
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.