2010-08-02 151 views
3

I'trying爲float轉換爲int值在PHP中:PHP意想不到的結果投

var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930! 
var_dump((int)(39.2 * 100.0)); //Returns 3920 

我可以使用小區,使其工作,但有人可以解釋這樣對我?

var_dump((int)ceil(39.3 * 100.0)); //Returns 3930 
+0

一個簡單的說明,希望你期待3930,而不是3939. – Fenton 2010-08-02 07:12:41

回答

9

這是因爲基數爲10的有限表示的數字在PHP使用的浮點表示形式中可能有也可能沒有確切的表示形式。

 
>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));" 
string(45) "3929.9999999999995452526491135358810424804688" 

由於int總是舍入數下來,表示一個小錯誤使鑄造輪是一個數下來,否則你將期望。

請考慮使用round代替。

+0

你不應該既不使用字符串也不使用圓,bcmul函數在那裏是有目的的。 – Shehabix 2016-09-16 16:43:06

1

你應該看看這個頁面:http://php.net/manual/en/language.types.float.php。它描述了使用浮點數的陷阱。

+0

另一個很好的參考,顯示這是大多數計算機語言的常見問題是http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems – 2010-08-02 07:42:55

1
// gives: int(3930) 
var_dump(intval((39.3 * 100.0) . '')); 

,或者與函數的使用:

function floatToInteger ($fValue) 
{ 
    return (intval(($fValue + 0) . '')); 
} 

// gives: int(3930) 
var_dump(floatToInteger(39.3 * 100.0)); 
3

這可能是晚了,但要做到這一點是如下正確的方法:

(int) bcmul(39.3, 100.0); // 3930 
(int) bcmul(39.2, 100.0); // 3920 

以及處理數字/浮點數的計算,或涉及金錢交易的任何事情,你不應該直接使用乘法/分裂+投射。

請參見本還有:

http://php.net/manual/en/book.bc.php

通知:在我的答案鑄造僅僅是字符串轉換爲中等,(你不需要做)