为了账号安全,请及时绑定邮箱和手机立即绑定

比较浮点数的PHP问题

比较浮点数的PHP问题

PHP
杨__羊羊 2022-06-17 16:47:23
有人可以帮我弄清楚为什么这个最基本的代码在 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";
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

你可以试试这个:


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函数你可以在这里阅读更多


查看完整回答
反对 回复 2022-06-17
?
动漫人物

TA贡献1815条经验 获得超10个赞

尝试这个


$lside = 490.84;

$rside = 237.80 + 31.04 + 222;

$newRside = number_format($rside,2);


if( $lside == $newRside ){

   echo "they are equal\n";

} else {

   echo "not equal\n";

   echo "rside: [$rside]\n";

   echo "lside: [$lside]\n";

}


查看完整回答
反对 回复 2022-06-17
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号