2017-04-05 113 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