为什么`intval(19.9 * 100)`等于`1989`?

时间:2010-03-23 03:34:12

标签: php

男孩,这个真的很奇怪。我希望以下代码可以打印1990年,但它会打印1989年!

$val = '$19.9';

$val = preg_replace('/[^\d.]/','',$val);
$val = intval($val * 100);

echo $val;

为什么会发生这种情况?

编辑:和此代码:

$val = '$19.9';
$val = preg_replace('/[^\d.]/','',$val);
echo $val . "<br>";
$val = $val * 100;
echo $val . "<br>";
$val = intval($val);
echo $val;

打印:

19.9
1990
1989

为什么intval(1990)等于1989 ???

5 个答案:

答案 0 :(得分:17)

这是PHP中浮点数固有的精确问题,以及许多其他语言。这个错误报告在铸造为int:

的上下文中讨论了一下

http://bugs.php.net/bug.php?id=33731

请尝试round($val * 100)

答案 1 :(得分:4)

答案 2 :(得分:2)

  

为什么intval(1990)等于1989 ???

因为你正在接受intval(1990)。您正在使用intval($val * 100),其中$val是一个接近但略小于19.9的数字。

阅读The Floating-Point Guide以了解其原因。

至于如何修复它:不要使用浮点值来赚钱。在PHP中,您应该使用BCMath代替。

答案 3 :(得分:0)

$val是一个浮点数 - "19.9" * 100的结果。浮点数在任何语言中都不是100%准确(这是设计使然)。如果美元值需要100%十进制精度,则应使用整数并使用美分执行所有计算(例如,"$19.90"应为1990)。

答案 4 :(得分:0)

我的代码也遇到了类似的问题,但是得到了解决方法php.net

需要将变量转换为字符串以进行intval操作,例如:

intval( 9.62 * 100 )  //gives 961
intval( strval( 9.62 * 100 ) )  //gives 962