Javascript で小数点を 2 つ追加すると間違った結果になるのはなぜですか? [重複] 質問する

Javascript で小数点を 2 つ追加すると間違った結果になるのはなぜですか? [重複] 質問する

重複の可能性あり:
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数字の表示方法を細かく制御できる機能をお試しください。

おすすめ記事