我有一個字符串「65.57」。 我需要得到INT 6557奇怪的鑄造行爲
但是......
(int) (((float) "65.57") * 100) === 6556
奇怪的是,當打散,一切正常:
((float) "65.57") * 100) === 6557.0
和
(int) 6557.0 === 6557
但是當內聯,我越來越6556.
我有一個字符串「65.57」。 我需要得到INT 6557奇怪的鑄造行爲
但是......
(int) (((float) "65.57") * 100) === 6556
奇怪的是,當打散,一切正常:
((float) "65.57") * 100) === 6557.0
和
(int) 6557.0 === 6557
但是當內聯,我越來越6556.
不要弄亂花車,他們只會給你帶來痛苦。 :)
我剛剝離出點:
$s = '65.57';
$x = str_replace('.', '', $s);
如果你確實需要一個int,然後把結果:
$x = (int) str_replace('.', '', $s);
是的,我正在考慮走這條路。看起來很奇怪,在內聯時,我得到了一個結果,當分解成單獨的語句時,我得到了預期的結果... – Ben
像亞歷克斯說
不要亂花車,他們只會給你帶來痛苦。 :)
function parsePrice($str) {
$parts = explode('.', $str);
return intval($parts[0]) * 100 + intval($parts[1]);
}
var_dump(parsePrice('65.57'));
// Output: int(6557)
您在浮點不精確的問題都有所涉獵。
問題是,浮點總是有小數位數,有時還有一些小數位隱藏起來,因此,您偶爾會遇到並不總是像您所期望的那樣相乘的結果。
真正的原因在於二進制,我們習慣於一個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
'回波序列化((浮動) 「65.57」 * 100);'它轉換爲int,它只是截斷。你可以四捨五入,但仍然不應該在這裏使用浮點數。 – AbraCadaver
爲什麼發生這種情況的答案是[本頁]上的「警告浮點精度」主題的第二段(http://php.net/manual/en/language.types.float.php#warn.float -precision) – DFriend
[「永遠不會將未知分數轉換爲整數」](http://us2.php.net/manual/en/language.types.integer.php#language.types.integer.casting)字符串操作感覺像過度殺傷(對我來說)。你可以用'round'來代替。 – csirmazbendeguz