2017-04-05 119 views
0

我有一個字符串「65.57」。 我需要得到INT 6557奇怪的鑄造行爲

但是......

(int) (((float) "65.57") * 100) === 6556

奇怪的是,當打散,一切正常:

((float) "65.57") * 100) === 6557.0

(int) 6557.0 === 6557

但是當內聯,我越來越6556.

+0

'回波序列化((浮動) 「65.57」 * 100);'它轉換爲int,它只是截斷。你可以四捨五入,但仍然不應該在這裏使用浮點數。 – AbraCadaver

+0

爲什麼發生這種情況的答案是[本頁]上的「警告浮點精度」主題的第二段(http://php.net/manual/en/language.types.float.php#warn.float -precision) – DFriend

+0

[「永遠不會將未知分數轉換爲整數」](http://us2.php.net/manual/en/language.types.integer.php#language.types.integer.casting)字符串操作感覺像過度殺傷(對我來說)。你可以用'round'來代替。 – csirmazbendeguz

回答

1

不要弄亂花車,他們只會給你帶來痛苦。 :)

我剛剝離出點:

$s = '65.57'; 
$x = str_replace('.', '', $s); 

如果你確實需要一個int,然後把結果:

$x = (int) str_replace('.', '', $s); 
+0

是的,我正在考慮走這條路。看起來很奇怪,在內聯時,我得到了一個結果,當分解成單獨的語句時,我得到了預期的結果... – Ben

0

像亞歷克斯說

不要亂花車,他們只會給你帶來痛苦。 :)

function parsePrice($str) { 
    $parts = explode('.', $str); 
    return intval($parts[0]) * 100 + intval($parts[1]); 
} 

var_dump(parsePrice('65.57')); 

// Output: int(6557) 
0

您在浮點不精確的問題都有所涉獵。

問題是,浮點總是有小數位數,有時還有一些小數位隱藏起來,因此,您偶爾會遇到並不總是像您所期望的那樣相乘的結果。

真正的原因在於二進制,我們習慣於一個10位的數字系統。就像我們無法完全描述1/3(〜0.3333333333 ..)二進制不能總是用10個鹼基來描述我們的「十分精細的小數」一樣,您可以調整PHP使用的精度來計算php.ini中的浮點數。但是如果避免使用浮點數,並且使用整數進行計算,則會更好。

更多關於話題:

Floating point inaccuracy examples

Can I rely on PHP php.ini precision workaround for floating point issue