2013-10-22 38 views
0

我與BIGINT值的PHP表示試驗(這是在表中的鍵),並測試PHP如何處理大量的字符串/浮點值我寫了一個小小的測試:PHP BIGINT表示

<?php 
echo "PHP_INT_MAX=".PHP_INT_MAX."\n"; 
$x = "9223372036854775107"; 
echo "Defining x as : 9223372036854775107\n"; 
$y = floatval($x); 
echo "float of x: ".$y."\n"; 
echo "float to string using strval: ".strval($y)."\n"; 
echo "float to string using sprintf: ".sprintf("%.0f", $y)."\n"; 
?> 

所以我很好奇輸出:

PHP_INT_MAX=9223372036854775807 
Defining x as : 9223372036854775107 
float of x: 9.2233720368548E+18 
float to string using strval: 9.2233720368548E+18 
float to string using sprintf: 9223372036854774784 

那麼,爲什麼我會得到不匹配的值? (php.ini文件中的精度= 14)

+0

他們看起來像他們一致對我來說,哪來的差異? –

+0

您瞭解精確度設置 - '92233720368548'在該數字中有14位有效數字。將設置增加到20以看到它就像你想要的。 –

+0

我已經添加了與ini_set('precision',32)相同的測試;並且仍然相同(標記:9223372036854775107!= 9223372036854774784) –

回答

1

這是關於浮點類型。 PHP使用常見的標準IEEE 754

浮點大小是64.在64位系統整數大小也是64。

但沒有小數部分而沒有精度損失的最大浮點數爲9007199254740991.由於存儲浮點數的格式存儲的數字超過了這些數字,因此失去了精度。

在2^52 = 4,503,599,627,370,496和2^53 = 9,007,199,254,740,992之間,可表示的數字恰好是整數。對於下一個範圍,從2^53到2^54,一切都乘以2,所以可表示的數字是偶數等等。相反,對於之前從2^51到2^52的範圍,間距爲0.5等等。

作爲在2^n到2^n + 1範圍內的數字的一部分的間距是2^n-52。因此,將數字四捨五入到最接近的可表示值(機器epsilon)時的最大相對舍入誤差爲2^-53。

Double-precision floating-point format

+0

有趣!所以基本上這意味着如果我們使用float來表示BIGINT值,它們不應該超過9007199254740991(它表示沒有損失成功)......我想我們會記住這一點,並感謝sectus,謝謝你的答案! –

+0

另外,您可能會在算術運算中丟失浮點數的精度。 – sectus