ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の浮動小数点値演算で丸めエラーが発生する理由を調べる

JavaScript の浮動小数点値演算で丸めエラーが発生する理由を調べる

巴扎黑
巴扎黑オリジナル
2017-07-22 16:54:281671ブラウズ

問題

JavaScript では、整数と浮動小数点数の両方が Number データ型 (単純なデータ型の 1 つ) に属しており、印刷するときによく見つかります1.0这样的浮点数的结果是1而非1.0,这是由于保存浮点数的内存空间是保存整数值的两倍,所以ECMAScript会不失时机地将浮点数转换为整数。 
上面这种情况虽然让强迫症患者有点不舒服,但是好歹也不是什么大错,接下来这种情况就很吓人了。例如我们在计算0.10.2时,它的输出结果不是0.3,而是0.3000000000000004。何だ? !初めてこのような状況に遭遇した子どもたちにとって、あなたの世界観は挑戦されたと感じますか?

原因

そこで、私は魂と体を救うために急いで本を開いたところ、その本にはっきりと書かれていることを発見しました: ECMAScrip は IEEE754 数値浮動小数点計算に基づいており、この数値計算方法は値を 2 進数として保存します。浮動小数点数は 2 進数で表現すると無限大になるため、四則演算を実行すると 丸め誤差 が発生するため、浮動小数点数の計算の精度は整数の計算よりもはるかに低くなります。 最後に、特定の浮動小数点数の値をテストしないでください

解決策

いわゆる、適切な薬を処方する、問題の原因がわかれば、問題の解決策を見つけることができます。これは浮動小数点数の 2 進数が無限であるために発生するエラーなので、このエラーは整数演算には存在しません。真実を理解できるほど賢明ですか?そう、それは算術工学において浮動小数点数を整数に変換し、その結果を浮動小数点数に変換することです。ゲストオフィサー、以下は新しくアップロードされたコードです~

1 //加法  2 function FloatAdd(arg1,arg2){  
3        var r1,r2,m; 
4        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数};  //参数1小数点后的位数5        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数6        m=Math.pow(10,Math.max(r1,r2));  //取其中较大的位数7        return (arg1*m+arg2*m)/m;        //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数8   }


上記を転載し、元のURLを添付します


toFixed() メソッドは部分も処理できるはずです丸め誤差の問題を確実な方法で解決します。

構文:number.toFixed(x) x: 10 進数の桁数を指定します。これは、0 と 20 を含む、0 から 20 までの値です。一部の実装では、より大きな数値範囲をサポートできます。このパラメータを省略した場合は、代わりに 0 が使用されます。


終了


以上がJavaScript の浮動小数点値演算で丸めエラーが発生する理由を調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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