JavaScript の除算精度について話しましょう

PHPz
リリース: 2023-04-24 15:05:02
オリジナル
1343 人が閲覧しました

多くのプログラマーにとって、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!