ホームページ >ウェブフロントエンド >jsチュートリアル >js浮動小数点計算の問題を詳しく解説

js浮動小数点計算の問題を詳しく解説

零下一度
零下一度オリジナル
2017-06-30 10:18:091418ブラウズ

分析

JavaScript には Number という数値型が 1 つだけあり、JavaScript 内のすべての数値は IEEE-754 標準形式で表されます。 浮動小数点数の精度の問題は JavaScript に固有のものではありません。10 進数によっては 2 進数で表現される桁数が無限であるためです: Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的。 浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的:

0.1              0.0001100110011001100110011001100110011001100110011001101
0.2              0.001100110011001100110011001100110011001100110011001101
0.3              0.010011001100110011001100110011001100110011001100110011
0.5              0.1
0.6              0.10011001100110011001100110011001100110011001100110011

所以比如 1.1

1.09999999999999999
したがって、たとえば、1.1 の場合、プログラムは実際には '1.1' を表すことができません。ある程度の精度しか得られず、精度の低下は避けられません:

 输入               输出1.0-0.9 == 0.1     False1.0-0.8 == 0.2     False1.0-0.7 == 0.3     False1.0-0.6 == 0.4     True1.0-0.5 == 0.5     True1.0-0.4 == 0.6     True1.0-0.3 == 0.7     True1.0-0.2 == 0.8     True1.0-0.1 == 0.9     True
JavaScript では問題はより複雑になります。ここに Chrome でのテスト データをいくつか示します:

(1.0-0.9).toFixed(digits)     // toFixed() 精度参数须在 0 与20 之间(1.0-0.9).toFixed(10)== 0.1   // 结果为True(1.0-0.8).toFixed(10)== 0.2   // 结果为True(1.0-0.7).toFixed(10)== 0.3   // 结果为True(11.0-11.8).toFixed(10) == -0.8   // 结果为TrueparseFloat((1.0-0.9).toFixed(10)) === 0.1   // 结果为TrueparseFloat((1.0-0.8).toFixed(10)) === 0.2   // 结果为TrueparseFloat((1.0-0.7).toFixed(10)) === 0.3   // 结果为TrueparseFloat((11.0-11.8).toFixed(10)) === -0.8   // 结果为True

解決策
それでは、どうすればよいでしょうか。 ` 1.0-0.9 != 0.1 ` でこの種のバグ以外の問題を回避するには?以下は一般的に使用される解決策です。これは、精度削減プロセスが常に自動的に丸められるため、浮動小数点演算の結果を判断する前に計算結果の精度を下げることです。リーリー

以上がjs浮動小数点計算の問題を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。