php浮動小数点数比較方法


浮動小数点数演算精度問題
まず例を見てみましょう.

$a+$b=$cはtrueを返し、正しい$c-$b=$aはfalseを返します.エラーはなぜですか.演算後、精度が20ビットの場合に実際に返される内容は以下の通りです.

$c-$bは0.099999999999999997780であるため、0.1と比較してfalseに戻ると、浮動小数点数の計算には精度が関与し、浮動小数点数がバイナリに移行すると精度が失われる可能性があるため、この問題が発生します. 
浮動小数点数変換バイナリメソッド
整数部は2で割る余りの方法を採用する小数部は2を乗じて整頓する方法を採用する例えば:数字の8.5を2進数の整数部に回転するのは8 8/2=4 8%2=0 4%2=4%2=0 2/2=1 2%2=0 2%2=0で、そのため計算する必要がなくて、整数8の2進数が1000の小数部は0.5 x 2=1.0で整頓した後の小数部が0なため、したがって、小数点以下0.5の2進数が0.1 8.5の2進数が1000.1である計算数字0.9の2進数0.9 x 2=1.8 0.8 x 2=1.6 x 2=1.2 x 2=0.4 x 2=0.8 x 2=1.6 x 2=0.2 x 2=0.4 x 2=0.8 x 2=1.6…その後繰り返し,切り出し精度がNの場合,Nの後の数は切り捨てられ,精度が失われる.上記の例では0.9がバイナリに移行すると精度が失われ,比較時にエラーが発生した.だから、浮動小数点数が最後の1位に正確であることを信じないでください.2つの浮動小数点数が等しいかどうかを比較しないでください.  
浮動小数点数を正しく比較する方法
 
1.roundメソッドで処理して比較する
例:

 
2.高精度演算方法を用いる
まず演算を行う場合は,高精度の演算方法を用いることで,精度が失われないことを保証できる.高精度演算の方法は以下の通りである:bcaddは2つの高精度デジタルをbccompに加算して2つの高精度デジタルを比較し、-1,0,1 bcdivに戻り、2つの高精度デジタルをbcmodに除去して高精度デジタル残数bcmulを求め、2つの高精度デジタルをbcpowに乗算して高精度デジタル乗方bcpowmodを求め、高精度デジタル乗方を求めるbcscale配置のデフォルト小数点数を求める.Linux bcの「scale=」bcsqrtに相当する高精度デジタル平方根bcsubを求める2つの高精度デジタルを減算する例: