簡體   English   中英

PHP錯誤近似於printf

[英]PHP wrong approximation with printf

我完全知道二進制格式的浮點表示,所以我知道在嘗試以任何編程語言完美表示浮點數時都有數學上的“不可能”。 但是,我希望編程語言在處理近似值時會遵循一些眾所周知的規則。

話雖如此,我讀到(也是在stackoverflow上)PHP中的printf可能是“正確截斷/逼近”數字的最佳方法,而且-再次-我很清楚,我可以輕松地編寫單行函數給我“完美”的近似值。 這只是為了避免出現諸如“為什么不使用XXX或不使用YYY?”之類的答案。

嘗試這個:

for($i=0; $i<10; $i++) {
  $k = 1.50 + $i/1000;
  printf("%f %.2f<br>", $k, $k);
}

這是輸出:

1.500000 1.50
1.501000 1.50
1.502000 1.50
1.503000 1.50
1.504000 1.50
1.505000 1.50
1.506000 1.51
1.507000 1.51
1.508000 1.51
1.509000 1.51

如您所見,將1.504(正確)打印為1.50,並將1.506(正確)打印為1.51。 但是為什么將1.505打印為1.50? 它必須是1.51,而不是1.50!

謝謝...

您應該使用round函數顯式舍入這些值,以便能夠將參數mode使用以下值:

PHP_ROUND_HALF_UP -- Round val up to precision decimal places away from zero, when it is half way there. Making 1.5 into 2 and -1.5 into -2.

PHP_ROUND_HALF_DOWN -- Round val down to precision decimal places towards zero, when it is half way there. Making 1.5 into 1 and -1.5 into -1.

功能:

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

查看完整說明:

http://php.net/manual/zh/function.round.php

編輯:

for($i=0; $i<10; $i++) {
  $k = 1.50 + $i/1000;
  printf("%f %f<br>", $k, round($k,2,PHP_ROUND_HALF_UP));
}

暫無
暫無

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

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