ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScript の除算精度について話しましょう
多くのプログラマーにとって、JavaScript の数値型は非常に単純な部分であるように見えます。しかし実際には、JavaScript の除算の精度は開発者の間で長年の問題です。
この問題の発生は、一方では JavaScript のデータ型設計に起因し、他方では、さまざまな特殊な状況に対処するために ECMAScript によって行われた妥協に起因します。具体的には、ECMAScript 仕様では、整数と浮動小数点数という 2 つの数値タイプが定義されています。浮動小数点数は、単精度浮動小数点数 (つまり、32 ビット浮動小数点数) と倍精度浮動小数点数 (つまり、64 ビット浮動小数点数) に分類されます。 JavaScript では、浮動小数点数は Number 型であり、唯一の違いはそれらが占める桁数です。
たとえば、単純な除算の計算を見てみましょう:
console.log(1/3); // 输出 0.3333333333333333
これは問題ないように見えますが、これを拡張すると:
console.log(1/3 + 1/3 + 1/3); // 输出 0.9999999999999999
結果は明らかに私たちのものと異なります。期待される結果。これは、JavaScript が計算時に倍精度浮動小数点数を使用するため、倍精度浮動小数点数の精度制限には限界があります。特に、倍精度浮動小数点数として正確に表現できない数値を JavaScript が処理する場合、丸めエラーが発生します。この問題は数値の比較に影響を与えるだけでなく、データ処理の正確性にも悪影響を及ぼします。
では、この問題を回避するにはどうすればよいでしょうか?
実際の開発では、計算問題を処理するために BigDecimal.js などのいくつかのライブラリを使用することを選択できます。このようなライブラリは、大きな数値に対して浮動小数点演算を実行するのに適しており、より正確な結果を取得できます。ただし、その使用には、計算精度とメモリ使用量とのバランスも考慮する必要があります。
さらに、もう 1 つの一般的な解決策は、計算のために浮動小数点数を整数に変換し、最終的に結果を逆変換することです。例:
// 令计算精度到小数点后 2 位 var precision = 100; console.log(Math.round((1/3) * precision + (1/3) * precision + (1/3) * precision) / precision); // 输出 0.33
この方法では、浮動小数点数演算の精度の問題をある程度回避できますが、精度の値は特定の状況に応じて選択する必要があります。
さらに、ES6 の新しい Number.EPSILON 定数と toFixed() メソッドを使用して、JavaScript の精度の問題を補うこともできます。
console.log(Math.abs((1/3 + 1/3 + 1/3) - 1) < Number.EPSILON); // 输出 true console.log((1/3 + 1/3 + 1/3).toFixed(2)); // 输出 "1.00"
上記のどちらの方法でも、適用範囲と制限事項に注意する必要があります。
一般に、JavaScript における除算精度の問題はよくある問題であり、対処が困難です。詳細を正しく理解するには、数学的演算に関するある程度の知識と JavaScript 言語についての深い理解が必要です。この記事が、読者が JavaScript の除算精度の問題を回避し、コードの品質を向上させるのに役立つことを願っています。
以上がJavaScript の除算精度について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。