簡體   English   中英

PHP浮點精度:var_dump是否秘密舍入,我該如何調試precisley呢?

[英]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.

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