ホームページ  >  記事  >  バックエンド開発  >  PHPの浮動小数点数比較方法を図で詳しく解説

PHPの浮動小数点数比較方法を図で詳しく解説

墨辰丷
墨辰丷オリジナル
2018-05-22 16:34:231244ブラウズ

この記事では、参考値となる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

0.8x2=1.6

…が N の場合、N 以降の数値は四捨五入されるため、精度が失われます。

上記の例では、バイナリに変換すると 0.9 の精度が失われ、比較中にエラーが発生します。

したがって、浮動小数点数が最後の桁まで正確であるとは絶対に信じないでください。また、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を返す、 1

bcp

2つの高精度数値を除算します

bcmod

高精度数値の余りを求めます

bcmul

2つの高精度数値を掛けます

bcpow

高さを求める 精度 デジタル乗算器 pBCPOWMOD

高精度デジタル乗算モデルを検索します

BCSCALE

Linux BC の "scale =

bcsqrt

に相当するデフォルトの小数点を設定します。 数値の平方根

bcsub

2つの高精度数値を減算します例:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);     // false
var_dump(bcsub($c, $b, 1)==$a); // true
?>



関連する推奨事項:

JSの詳細な説明

浮動小数点数値

演算処理(グラフィックとテキスト) ) チュートリアル)

浮動小数点数の平方根を求める

JavaScriptの実装詳しい説明

PHPでの不正確な浮動小数点数演算の例を共有


以上がPHPの浮動小数点数比較方法を図で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。