首页 > 解决方案 > 比较浮点数的PHP问题

问题描述

有人可以帮我弄清楚为什么这个最基本的代码在 PHP 中不起作用吗?多年来一直使用 PHP,但从未见过这种情况......因为我在 sandbox.onlinephpfunctions.com 网站上对其进行了测试,所以它在每个版本的 php 上都是一致的,请参见代码片段下方的链接。

我想做的就是将一个数字与另一个数字进行比较,但是当数字包含浮点数时,事情会变得很奇怪。

<?php

$lside = 490.84;
$rside = 237.80 + 222.00 + 31.04;

if( $lside == $rside ){
   echo "they are equal\n";
} else {
   echo "not equal\n";
   echo "rside: [$rside]\n";
   echo "lside: [$lside]\n";
}

http://sandbox.onlinephpfunctions.com/code/6dee3a97f68a11e67fbaa8e5c157b827ecd47740

帮助和感谢!

编辑:这是我最终从收到的答案中解决此问题并进一步研究的方法:

<?php

$lside = 490.84;
$rside = 237.80 + 222.00 + 31.04;

if( (string)$lside == (string)$rside ){
   echo "they are equal\n";
} else {
   echo "not equal\n";
   echo "rside: [$rside]\n";
   echo "lside: [$lside]\n";
}

因此,要在 PHP 中比较两个数字,一种安全的方法是强制它们成为字符串……看图。

我进行了一些额外的测试,以确保这是真的并且似乎总是有效。所有这些都返回“好”:

if( "1" == "1" ) echo "1 - good\n";
if( "1.0" == "1" ) echo "2 - good\n";
if( "1" == "1.0" ) echo "3 - good\n";
if( "1.0" == "1.0" ) echo "4 - good\n";
if( "1.0" == "1.00000000" ) echo "5 - good\n";
if( "1.000000000000000" == "1.00000000" ) echo "6 - good\n";
if( "2" == (string)(.5+.5+1) ) echo "7 - good\n";
if( "2.000000000000000" == (string)(1+1) ) echo "8 - good\n";
if( "2.000000000000000" == (string)(1.0+1) ) echo "9 - good\n";
if( "2.4" == (string)(1.4+1) ) echo "10 - good\n";
if( "2.40000" == (string)(1.4+1) ) echo "11 - good\n";
if( "2.000000000000000" == (string)(.5+.5+1) ) echo "12 - good\n";
if( "1.5" == (string)(.5+.5+.5) ) echo "13 - good\n";
if( "1.500000000000000" == (string)(.5+.5+.5) ) echo "14 - good\n";

标签: phpmath

解决方案


你可以试试这个:

if( bccomp($lside, $rside, 2) == 0 ){
   echo "they are equal\n";
} else {
   echo "not equal\n";
   echo "rside: [$rside]\n";
   echo "lside: [$lside]\n";
}

因为比较float的时候有一个复杂的东西,你可以在这里阅读更多,对于bccomp函数你可以在这里阅读更多


推荐阅读