我有一个字符串“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