男孩,这个真的很奇怪。我希望以下代码可以打印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
???
答案 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