【问题标题】:PHP function for float or double comarision (bccomp and gmp_cmp)用于浮点或双精度的 PHP 函数(bccomp 和 gmp_cmp)
【发布时间】:2013-02-09 16:22:46
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

    标签: php floating-point numbers floating-accuracy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先,如果要比较浮点数,可以使用内置的比较运算符,例如 &lt;,如 the page you linked to 的“比较浮点数”标题下所述。

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

      第三,bccomp 是一种比较浮点值的残暴方式:

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

      【讨论】:

      • 感谢 Eric,我现在正在改进当前应用程序,它使用 round 到 10 然后使用
      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多