2014-06-27 36 views
0

我目前正在嘗試用大小數進行數學運算。這工作得很好:具有長小數的PHP數學

<?php 
$math = 99 + 0.0001; 
echo $math; 
?> 

Output: 99.0001 

然而,當我嘗試使用超過12的小數位小數加,我沒有收到預期的輸出:

<?php 
$math = 99 + 0.0000000000001; 
echo $math; 
?> 

Output: 99 

我怎樣才能讓這個如果我添加了一個小數點後12位以上的小數,結果仍然沒有四捨五入的確切答案?例如:

<?php 
$math = 99 + 0.0000000000001; 
echo $math; 
?> 

Output: 99.0000000000001 
+1

使用[BC Math](http://us2.php.net/manual/en/book.bc.php) –

+0

通過使用sprint()或調整精度設置php.ini防止PHP四捨五入時顯示 –

+0

http://stackoverflow.com/questions/670662/whats-the-maximum-size-for-an-int-in-php – samayo

回答

0

快速谷歌搜索yield this

浮點數的精度有限。儘管它取決於 系統,PHP通常使用IEEE 754雙精度格式, 這將由於在順序1.11e-16的 四捨五入得到最大相對誤差。

我鏈接的頁面有很多關於PHP中浮點數的有用信息,以及可以使用任意精度浮點數的庫的鏈接。根據您的需求可能會有用。另外,正如Mark Ba​​ker在評論中所說,您可能還需要指定要在printf()格式字符串中打印的數字的精確度。請檢查this page並查看編號5.

+0

請注意,內部數字精度(64位雙精度對比32位精度對128位精度雙精度)與打印格式的位數或精度不同。顯然,你不能格式化原始數據中沒有的東西,還有,你可以有很多內部精度,但是如果你沒有格式化到足夠的小數位數......歡迎來到數值分析101的精彩世界! –

+0

@PhilPerry:PHP的'zval'使用'double'來存儲小數,其定義 - 在C中是一個雙精度浮點數。由於PHP是用C語言編寫的,所以假設float是64位雙精度是公平的。 C標準沒有規定「長雙」。它可以與「double」相同,可以是80位精度數據類型,也可以是IEEE四位128位格式。你只是不能確定 –

+0

這一點仍然是,你必須知道一個數字的內部表示能夠存儲什麼,以及你如何格式化數字進行演示。您還需要了解數學運算對範圍內距離甚至非常接近的數字的影響。這都是基本的NA。 –