意外的PHP数学小数运算
$nt=(float) number_format("26031.87",2,".",""); // 26031.87
$nt2=(float) 546669.02-520637.15; // 26031.87
if($nt>$nt2)
echo "$nt / $nt2 ⇽ What's wrong with this!? :@";
关键是为什么会发生这种情况?,如果视觉上看起来相同,一个粗略的解决方案是对 $nt2 执行 number_format() ,但是...为什么?
更新 :: $nt-$nt2 输出 3.6379788070917E-12
$nt=(float) number_format("26031.87",2,".",""); // 26031.87
$nt2=(float) 546669.02-520637.15; // 26031.87
if($nt>$nt2)
echo "$nt / $nt2 ⇽ What's wrong with this!? :@";
the point is why this happen?, if visually looks the same, a chunky solution is doing number_format() to $nt2, but... WHY??
updating :: $nt-$nt2 outputs 3.6379788070917E-12
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
http://php.net/manual/en/language.types.float.php 看到那个大红色警告横幅。 :)
为了比较浮点数,您可以使用:(
将
0.00001
更改为您需要的比较精度)。http://php.net/manual/en/language.types.float.php see that big red warning banner. :)
For comparing floats you can use:
(change
0.00001
to comparison precision you need).Per Zend:
在比较两个浮点数时,PHP 似乎没有做合乎逻辑的事情,这是由于数字的内部表示造成的。解决方案就是永远不要比较浮点数是否相等!
在比较它们之前将它们转换为 INT 或使用 bc_math。
Per Zend:
PHP doesn't seem to do the logical thing when comparing two floats, and this is due to the internal representation of the numbers. The solution is simply never compare floats for equality!
Convert them to INT before comparing them or use bc_math.