2013年6月30日

Float 浮點數型態

Float 浮點數型態

也稱作雙倍精準數(double)或實數(real)。可以用以下任一語法定義
<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
?>

Warning 浮點數的精準度

浮點數的精準度有限,儘管取決於系統,PHP通常使用IEEE 754 雙精準度格式,則由於取整數而導致的最大相對誤差為 1.11e-16。非基本數學運算可能會給出更大誤差,並且要考慮到進行多次運算時的誤差傳遞。

此外,以十進位制能夠精確表示的有理數如0.1或者0.7,無論有多少尾數都不能被內部所使用的二進位制精確表示,因為無法在不丟失一點點精準度的情況下轉換為二進制的格式。這就會造成混亂的結果。

例如,floor((0.1+0.7)*10),通常會得到7而不是預期的8,因為該結果內部的表示其實是類似7.9999999999999991118...。

所以永遠不要相信浮點數結果精確到了最後一位數,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精準度,應該使用任意精準度數學函數或者是gmp函數


轉換為浮點數型態

如果希望了解有關何時以及如何將字串轉換成浮點數的資訊,請參閱字串轉換為數值的章節。對於其他類型的值,其情況類似於先將值轉換成整數型態,然後再轉換成浮點數型態。
請參閱轉換為整數型態章節獲得更多的資訊。自PHP5起,如果試圖將物件轉換為浮點數,會發出E_NOTICE錯誤訊息。


比較浮點數

如上述警告訊息所述,由於內部機制的原因,比較兩個浮點數是否相等是有問題的。不過還是有迂迴的方式來比較浮點數數值的。

要測試浮點數是否相等,要使用一個儘比該數值大一點的最小誤差值。該值也被稱為機器最小值(epsilon)或者最小單元取整數,是計算中所能接受的最小差別值。

$a 和 $b 在小數點後五位精準度內都是相等的。
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
 
if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>


NaN

某些數字運算的結果會回傳一個常數NAN,在浮點數的計算中,這個結果代表一個未定義或者是無法表示的數。任何值對該NAN進行鬆散或嚴謹的比較皆會回傳FALSE。

因為NAN代表著不同的任何數字,NAN不應該拿來與其他的值進行比較,包括它自己。如果你想要檢查請使用is_nan()。

沒有留言:

張貼留言