2012-05-18 51 views
0

鑑於以下鱈魚:樓功能不能正常工作

$number = 1050.55; 
var_dump($number - floor($number)); 

爲什麼上面的代碼返回下面的結果呢?

float(0.54999999999995) 

我想要一個固定值,如0.55在這種情況下。你能幫我嗎?

+2

浮點運算並不總是精確的。這麼多重複... – Ryan

+0

你只是在尋找其餘的? –

+0

是的,只剩下 –

回答

3

浮點運算不精確,其餘錯誤很常見。 如果你知道,你想要的精確度是多少(例如點後兩位數),你可以對結果使用round()函數。 在這種情況下,這將是:

$number = 1050.55; 
var_dump(round($number - floor($number), 2)); 
1

請參閱this question。雖然這是關於Java和你問的PHP數學是一樣的。

+0

它幫助我理解爲什麼不精確,謝謝 –

2

對於大多數浮筒,二進制只能近似表示正確的號碼。規則是在一系列計算中執行floor(),ceil()或fmod()最後。在使用它們之後,至少只能做整數運算。如果你將一個int賦給float,就像你的代碼一樣,那麼floor()就不會像你期望的那樣表現出來。

打印浮標時使用printf()。它的轉換例程通常做得更好,並在截斷浮動數據時給出您所期望的答案。

編輯:或者,更確切地說,printf()在確定截斷位置時用於數字的十進制字符表示,因此您不會看到任何奇怪的,未指定的二進制/十進制轉換構件。