以下について
echo 0.02-0.01-0.06+0.05;
結果は
6.93889390391E-18
これは
echo -0.02+0.02;
結果が出ました
0
なぜ私はそれらのために異なる結果を得たのか知りたいです。0
2つの結果が得られると思います。
これが浮動小数点数の仕組みです。
浮動小数点演算は、通常の数学的規則とは実際には強く相関していません。たとえば、操作は結合的または分散的ではありません。
浮動小数点表現は、精度が制限された近似です。
これはPHP固有のものではありません。コンピューターは、私たちが概念化したように、単に数値を表すことができません。
ソースコードに数字「0.02」を書くと、コンパイラまたはインタプリタは浮動小数点を使用してそれらを表します。最も一般的な浮動小数点形式は、単精度または倍精度のIEEE754バイナリ浮動小数点です。
この浮動小数点形式では、ほとんどの10進数を正確に表すことはできません。たとえば、小数が1/3を正確に表すことができないのと同じように(約.3333ですが、有限長の10進数はどこかで終わるため、1/3とはわずかに異なります)、浮動小数点で使用される2進数は1を表すことができません。正確に/10(バイナリでは、1/10は約.000110011001100110011です)。
したがって、「0.02-0.01-0.06 + 0.05」と書くと、コンピューターはそれらの数値を正確に計算していません。近似を使用しています。したがって、得られる結果は近似値です。
正確な結果が必要な場合は、浮動小数点演算の詳細を学習して、エラーを回避する、またはエラーを修正できる演算を作成できるようにするか、整数演算のみを使用する必要があります。たとえば、上記のドルの金額を加算および減算する場合、代わりにペニーの金額を保存して「2-1-6+5」を計算できます。
小数点以下第2位または第3位に四捨五入すると、修正されます。
こんにちは、この問題にぶつかった人のために、BCMathライブラリ http://php.net/manual/en/ref.bc.phpの任意精度関数を使用できます。
echo 12606.69 + 3053.46 - 15660.15;
1.8189894035459E-12
と
echo bcadd((12606.69 + 3053.46),-15660.15);
0