0

PHP 建议使用这些函数进行浮点数比较 [这里]

bccomp — 比较两个任意精度数

int bccomp ( string $left_operand , string $right_operand [, int $scale ] )

gmp_cmp — 比较数字

int gmp_cmp ( resource $a , resource $b )

我使用了 bccomp但我仍然无法得到正确的结果:

<?php
$n1 = bcdiv(1, 2.36, 4);
$n2 = bcdiv(4237288, 10000000, 4);
echo bccomp( $n1, $n2, 4); // 0! must be 1

echo "<br>\n";
var_dump(bcdiv(1, 2.36, 4)); // string(6) "0.4237" 

echo "<br>\n";
var_dump(bcdiv(4237288, 10000000, 4)); // string(6) "0.4237" 

?>

到目前为止,我知道1/2.36的结果等于(0.4237288135593220338983050847457627118644067796610169491525423728813559322033898305084745762711864406......)

那么,我怎么知道这样的小数位数很大呢?

可能的解决方案:

$n1 = bcdiv(1, 2.36, 400);
$n2 = bcdiv(4237288, 10000000, 400);
echo bccomp( $n1, $n2, 400); //1

我认为这个解决方案直到不再可用。

有什么建议吗?

4

2 回答 2

1

首先,如果您想比较浮点数,您可以使用内置的比较运算符,如您链接到的页面<上的“比较浮点数”标题下所述。

其次,如果您不想要浮点值的直接比较(但想要某种容差或部分比较),那么您还没有指定实际想要的比较。对于您的应用程序的需要,究竟在什么情况下比较应该返回小于、等于和大于?

第三,bccomp比较浮点值的方法很糟糕:

  • 默认情况下,它会尝试使用值中的“位数”来确定要比较的容差。但是,二进制浮点值在此代码尝试测量它们的方式中没有许多十进制数字。
  • 即使他们这样做了,在各种操作之后可能出现在浮点值中的错误量也不是数字中小数位数的函数,因此位数不是衡量应该有多大容差的好方法被接受。
  • 一旦确定了可接受的误差容限,逐位比较就无法允许该容差。例如,如果您想接受两个相差小于 0.01 的值,但您通过比较它们的两位表示“3.5​​0”和“3.49”来比较值 3.4951 和 3.4949,它们将被报告为不相等甚至尽管它们仅相差 0.0002。
于 2013-02-24T15:28:23.663 回答
1

当您比较浮点数时,您必须选择比较比例。如果 400 是必要的,那么这就是你的规模。

或者......您可以尝试定义自己的除法函数并比较除法缩放的每一步的结果。它可能是一个递归函数。

于 2013-02-24T13:49:37.443 回答