この記事では、参考値となるPHPの浮動小数点数の比較方法を中心に紹介します。以下のエディタで見てみましょう
浮動小数点数演算の精度の問題
まず例を見てみましょう:
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($a+$b)==$c); var_dump(($c-$b)==$a); ?>
$a+$b==$c は true を返します、正しい
$c- $b==$aはfalseを返します、エラー
なぜこれが起こっているのですか?
演算後、精度が20桁の場合に実際に返される内容は以下の通りです:
<?php $a = 0.1; $b = 0.9; $c = 1; printf("%.20f", $a+$b); // 1.00000000000000000000 printf("%.20f", $c-$b); // 0.09999999999999997780 ?>
$c-$bは0.09999999999999997780なので、0.1と比較するとfalseが返されます。
これ問題は、浮動小数点の計算には精度が関係しており、浮動小数点数を 2 進数に変換すると精度が失われる可能性があるためです。
浮動小数点数の変換方法
整数部は2で割って余りを取る方式
小数部は2を乗じて切り上げる方式
例えば: 数値 8.5 を 2 進数に変換します
整数部分は 8 です
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2 %2=0
1 2より小さいので計算する必要はありません 整数8の2進法は 1000
小数部は0.5
0.5x2 = 1.0
四捨五入後の小数部は0なので、もう計算する必要はありません
のバイナリバージョン8.5のバイナリバージョンは
1000.1のバイナリバージョンを計算します番号0.9
0.9x2= 1.8
0.8x2= 1.6
0.6x2= 0.4
0.4x2= 0.8
したがって、浮動小数点数が最後の桁まで正確であるとは絶対に信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。
浮動小数点数を比較する正しい方法
1. ラウンドメソッドを使用して処理し、比較します
例:<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(round(($c-$b),1)==round($a,1)); // true ?>
2高いを使用します。 -精度の計算方法
最初に計算を行う際には、精度を失わないよう高精度の計算方法を使用してください。高精度演算の方法は以下の通りです:
bcadd
2つの高精度数値を加算bccomp
2つの高精度数値を比較し、-1,0を返す、 1bcp
2つの高精度数値を除算しますbcmod
高精度数値の余りを求めますbcmul
2つの高精度数値を掛けますbcpow
高さを求める 精度 デジタル乗算器 pBCPOWMOD高精度デジタル乗算モデルを検索します
BCSCALELinux BC の "scale =
bcsqrtに相当するデフォルトの小数点を設定します。 数値の平方根
bcsub2つの高精度数値を減算します例:
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(bcsub($c, $b, 1)==$a); // true ?>
関連する推奨事項:
PHPでの不正確な浮動小数点数演算の例を共有
以上がPHPの浮動小数点数比較方法を図で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。