重複の可能性あり:
JavaScript の Math は壊れていますか?
JS はなぜこの単純な計算を台無しにするのでしょうか?
console.log(.1 + .2) // 0.3000000000000004
console.log(.3 + .6) // 0.8999999999999999
最初の例は正しい結果よりも大きく、2 番目の例は小さいです。???!! これを修正するにはどうすればいいですか? 演算を実行する前に、常に小数を整数に変換する必要がありますか? 加算することだけを気にすればよいですか (* と / は私のテストでは同じ問題がないようです)?
私は答えを求めて多くの場所を探しました。一部のチュートリアル (ショッピング カート フォームなど) では、問題が存在しないかのように振る舞い、単に値を加算しています。専門家はさまざまな数学関数の複雑なルーチンを提供したり、JS が「うまく機能しない」と一言触れたりしていますが、説明はまだ見当たりません。
ベストアンサー1
これは JS の問題ではなく、より一般的なコンピュータの問題です。浮動小数点数は 2 進数で格納されるため、すべての 10 進数を適切に格納できません。例:
0.5 is store as b0.1
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc
so in binary 0.1 is 0.00011...
しかし、それは無限です。ただし、コンピューターはある時点で停止する必要があります。したがって、この例では 0.00011 で停止すると、0.1 ではなく 0.09375 になります。
とにかく、ポイントは、それが言語ではなくコンピュータに依存するということです。言語に依存するのは、数値の表示方法です。通常、言語は数値を許容可能な表現に丸めます。どうやら JS はそうしないようです。
したがって、必要なことは (メモリ内の数値は十分に正確です)、数値をテキストに変換するときに、何らかの方法で JS に数値を「適切に」丸めるように指示することだけです。
sprintf
数字の表示方法を細かく制御できる機能をお試しください。