有什么方法可以在 PHP 中正确比较浮点数吗?
Is there any way to compare float numbers correctly in PHP?
在PHP中,我愿意在一些操作后比较浮点数,但它显示不正确。
例如:
$a = 0.2;
if ( ($a - 0.2) === 0 )
return true;
else
return false;
它returns 错误。即使我尝试了 epsilon 常数,但有时它是不正确的。
有谁知道如何解决这个问题?
if (abs($a-0.2) < PHP_FLOAT_EPSILON)
由于四舍五入,您永远不应比较浮点数是否相等。一些在十进制系统中是有限的值,在双系统中是无限的(反之亦然)。
巧合的是0.2就是这样一个对偶无限浮点数...
0.2 decimal is 0.00110011001100110011 (repetend) binary
($a - 0.2) === 0
计算为 false,因为 ===
测试值和类型,并且 ($a - 0.2)
具有浮点类型但 0
具有整数类型。
如果将表达式更改为 ($a - 0.2) === 0.
,它将计算为真,因为值和类型将相同。如果将其更改为 ($a - 0.2) == 0
,它将评估为真,因为值将相同并且 ==
仅测试值。
只要把( ($a - 0.2) === 0 )
改成($a === 0.2)
就可以了
<?php
$a = 0.2;
if ($a === 0.2)
return true;
else
echo false;
你关于 ( ($a - 0.2) === 0 )
的问题是关于不同类型的,因为 ($a - 0.2)
是浮点数而 0 不是,所以这些可以是其他解决方案
修复类型问题(第一个解决方案)
<?php
$a = 0.2;
if (( ($a - 0.2) === 0.0 ))
return true;
else
return false;
修复类型问题(第二种解决方案)
<?php
$a = 0.2;
if (( ($a - 0.2) == 0 ))
return true;
else
return false;
使用这个方法:
$a = 0.2;
if ( abs($a - 0.2) < 0.00001 )
return true;
else
return false;
在PHP中,我愿意在一些操作后比较浮点数,但它显示不正确。 例如:
$a = 0.2;
if ( ($a - 0.2) === 0 )
return true;
else
return false;
它returns 错误。即使我尝试了 epsilon 常数,但有时它是不正确的。 有谁知道如何解决这个问题?
if (abs($a-0.2) < PHP_FLOAT_EPSILON)
由于四舍五入,您永远不应比较浮点数是否相等。一些在十进制系统中是有限的值,在双系统中是无限的(反之亦然)。
巧合的是0.2就是这样一个对偶无限浮点数...
0.2 decimal is 0.00110011001100110011 (repetend) binary
($a - 0.2) === 0
计算为 false,因为 ===
测试值和类型,并且 ($a - 0.2)
具有浮点类型但 0
具有整数类型。
如果将表达式更改为 ($a - 0.2) === 0.
,它将计算为真,因为值和类型将相同。如果将其更改为 ($a - 0.2) == 0
,它将评估为真,因为值将相同并且 ==
仅测试值。
只要把( ($a - 0.2) === 0 )
改成($a === 0.2)
就可以了
<?php
$a = 0.2;
if ($a === 0.2)
return true;
else
echo false;
你关于 ( ($a - 0.2) === 0 )
的问题是关于不同类型的,因为 ($a - 0.2)
是浮点数而 0 不是,所以这些可以是其他解决方案
修复类型问题(第一个解决方案)
<?php
$a = 0.2;
if (( ($a - 0.2) === 0.0 ))
return true;
else
return false;
修复类型问题(第二种解决方案)
<?php
$a = 0.2;
if (( ($a - 0.2) == 0 ))
return true;
else
return false;
使用这个方法:
$a = 0.2;
if ( abs($a - 0.2) < 0.00001 )
return true;
else
return false;