[英]PHP floating point precision: Is var_dump secretly rounding and how can I debug precisley then?
PHP中的浮點數是不准確的是眾所周知的( http://php.net/manual/de/language.types.float.php ),但在以下實驗后我有點不滿意:
var_dump((2.30 * 100)); // float(230)
var_dump(round(2.30 * 100)); // float(230)
var_dump(ceil(2.30 * 100)); // float(230)
var_dump(intval(2.30 * 100)); // int(229)
var_dump((int)(2.30 * 100)); // int(229)
var_dump(floor(2.30 * 100)); // float(229)
內部表示必須是229.999998
。
var_dump((2.30 * -100)); // float(-230)
var_dump(round(2.30 * -100)); // float(-230)
var_dump(ceil(2.30 * -100)); // float(-229)
var_dump(intval(2.30 * -100)); // int(-229)
var_dump((int)(2.30 * -100)); // int(-229)
var_dump(floor(2.30 * -100)); // float(-230)
內部表示必須類似於-229.999998
。
好吧據我所知 - 整數轉換以及intval函數簡單地刪除了該點后面的所有內容。 很高興知道。
但是var_dump()
給出的值為230,盡管實際值必須根據這些結果而不同。
現在來看看這個:
$a = 230.0;
var_dump($a); // float(230)
var_dump((int) $a); // int(230)
這意味着浮點數的內部表示在這里必須不同。 如果我想知道浮點數的確切值,那么我無法使用var_dump
調試,因為我習慣了嗎? 如何調試精確浮點值?
您可以嘗試使用number_format它不會是完美的,因為您必須提供小數位數,但應該有所幫助。
echo number_format(8-6.4, 50);
1.59999999999999964472863211994990706443786621093750
echo number_format(2.3*100, 50);
229.99999999999997157829056959599256515502929687500000
編輯:隨着小數位數的變化(這也取決於所使用的系統),以下可能有用 - 獲取完整數字以確保並刪除尾隨零:
echo rtrim(number_format(1.0/3.432, 100),0);
0.29137529137529138978379705804400146007537841796875
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.