奇怪的铸造行为

时间:2017-04-05 18:10:51

标签: php casting

我有一个字符串“65.57”。 我需要得到int 6557

...然而

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

奇怪的是,当分手时,一切都按预期工作:

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

(int) 6557.0 === 6557

但是在内联时,我得到了6556。

3 个答案:

答案 0 :(得分:1)

不要乱花车,它们只会给你带来痛苦。 :)

我只是删掉了点:

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

如果你确实需要一个int,那么转换结果:

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

答案 1 :(得分:0)

像Alex说的那样

  不要乱花车,它们只会给你带来痛苦。 :)

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

var_dump(parsePrice('65.57'));

// Output: int(6557)

答案 2 :(得分:0)

你偶然发现浮点不准确问题。

问题在于浮点总是有一些小数,有时会隐藏一些小数,因此,你会偶尔结束它们并不总是像你期望的那样相乘。 / p>

真正的原因在于二进制,我们习惯于10基数字系统。以同样的方式我们无法完美地描述1/3(~0.3333333333 ..)二进制不能总是描述我们在10-base中的“完美精细十进制数”,你可以调整PHP用来计算浮点数的精度在你的php.ini中。但是你可以避免使用浮点数,并使用整数进行计算。

有关该主题的更多信息:

Floating point inaccuracy examples

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