-5

为什么它等于总是假的?

<?php

$a = (0.1+0.2);
print $a."\n";  // results in 0.3
if ( (double)$a == (double)0.3 ) {
     echo "true";
}else{
     echo "not true";
}
echo PHP_EOL;

Perl

perl -e 'if ((0.2+0.1) == 0.3) {print "true\n"; } else { print "false\n"; }'

现在在 Python 中

python -c 'if ((0.2+0.1)!=0.3 ):  print "false" '
4

3 回答 3

2

You need to specify a tolerance [also referred to as epsilon] when comparing floating point values since it is not an exact representation of the number.

function f_cmp(float $a, float $b, float $tol = 0.00001) {
  if( abs($a - $b) < $tol ) { return 0; }
  else { return $a - $b; }
  // return 0 if "equal" within tolerance
  // return < 0 if $a < $b
  // return > 0 if $a > $b
  // for use with PHP functions like usort()
}

Or simply:

function f_eq(float $a, float $b, float $tol = 0.00001) {
  if( abs($a - $b) < $tol ) { return true; }
  else { return false; }
}
于 2013-04-18T17:34:53.320 回答
1

浮点值的精度有限。因此,经过任何处理后,值可能不会具有相同的字符串表示形式。这还包括在脚本中编写浮点值并直接打印它而无需任何数学运算。

如果您想了解更多关于“浮点数”以及 IEEE 754 是什么的信息,请阅读: http ://www.floating-point-gui.de/

(在http://bugs.php.net报告此类错误的人的标准答案)

于 2013-04-18T17:15:53.727 回答
1

在 Python 命令行中输入:

>>> 0.2 + 0.1

你可能会看到:

0.30000000000000004

0.2 和 0.1 没有二进制浮点的精确表示。有关详细信息,请参阅此链接:

http://docs.python.org/2/library/decimal.html

于 2013-04-18T17:16:06.303 回答