意外的PHP数学小数运算

发布于 2024-11-19 16:26:21 字数 366 浏览 1 评论 0原文

    $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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

第几種人 2024-11-26 16:26:21

http://php.net/manual/en/language.types.float.php 看到那个大红色警告横幅。 :)

为了比较浮点数,您可以使用:(

if (abs($nt1-$nt2) < 0.00001) {
    echo "Equal!";
}

0.00001 更改为您需要的比较精度)。

http://php.net/manual/en/language.types.float.php see that big red warning banner. :)

For comparing floats you can use:

if (abs($nt1-$nt2) < 0.00001) {
    echo "Equal!";
}

(change 0.00001 to comparison precision you need).

猫性小仙女 2024-11-26 16:26:21

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文