0

PHP 浮動小数点数の比較にこれらの関数を使用することをお勧めします [こちら]

bccomp — 2 つの任意精度数を比較する

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

浮動小数点数を比較するときは、スケールの比較を選択する必要があります。400 が nessary の場合、それがあなたのスケールです。

または...独自の除算関数を定義して、除算のスケーリングのすべてのステップで結果を比較することもできます。再帰関数かもしれません。

于 2013-02-24T13:49:37.443 に答える
1

まず、float を比較する場合は、リンク先のページの<「Comparing float」という見出しの下に記載されているように、などの組み込みの比較演算子を使用できます。

第 2 に、浮動小数点値を直接比較したくない場合 (ただし、ある種の許容範囲または部分的な比較が必要な場合) は、実際に必要な比較を指定していません。あなたのアプリケーションのニーズに対して、正確にはどのような状況で、比較はより小さい、等しい、より大きいを返す必要がありますか?

3つ目bccompは、浮動小数点値を比較するためのひどい方法です。

  • デフォルトでは、値の「桁数」を使用して、比較する許容範囲を決定しようとします。ただし、バイナリ浮動小数点値には、このコードが測定しようとする方法で 10 進数の桁数がありません。
  • たとえそうであったとしても、さまざまな演算の後に浮動小数点値に存在する可能性のあるエラーの量は、数値の 10 進数の桁数の関数ではないため、桁数は許容範囲の適切な尺度ではありません。受け付けます。
  • どの程度の許容誤差を許容できるかを判断すると、桁ごとの比較ではその許容誤差を許容できなくなります。たとえば、2 つの値の差が .01 未満の場合は等しいと受け入れたいが、2 桁の表現「3.50」と「3.49」を比較して値 3.4951 と 3.4949 を比較すると、等しくないと報告されます。 .0002 だけ違いますが。
于 2013-02-24T15:28:23.663 に答える