var numA = 0.1; var numB = 0.2; アラート(numA + numB); 0.1 + 0.2 = 0.300000000000000004 です。 浮動小数点数の四則演算については、ほぼすべてのプログラミング言語で同様の精度誤差の問題が発生しますが、C++/C#/Javaなどの言語では、精度の問題を回避するためにメソッドがカプセル化されています。JavaScriptは弱い型付けの言語であり、設計思想から浮動小数点数に厳密なデータ型がないため、精度誤差の問題が特に顕著になります。 0.1 と 0.2 をバイナリに変換してみましょう。
倍精度浮動小数点数の小数部は最大52ビットをサポートしているため、2つを加算すると、0.010011001100110011001100110011001100110011001100110011001100110011001100 という文字列が得られますが、これは浮動小数点数の小数点制限により切り捨てられた2進数です。このとき、10進数に変換すると、0.30000000000000004 になります。 どうすれば解決できるでしょうか? まず、数値を 10 の累乗で乗算し、小数点以下を削除して 2 進数に変換できる整数を取得し、計算後にそれを復元します。 /** ** 正確な除算結果を得るために使用される除算関数** 注: JavaScript の除算結果には誤差があり、2 つの浮動小数点数を除算するとより顕著になります。この関数はより正確な除算結果を返します。 ** 呼び出し: accdiv(arg1,arg2) ** 戻り値: arg1 を arg2 で割った正確な結果 **/ 関数accdiv(arg1, arg2) { var t1 = 0、t2 = 0、r1、r2; 試す { t1 = arg1.toString().split(".")[1].length; } キャッチ(e){ } 試す { t2 = arg2.toString().split(".")[1].length; } キャッチ(e){ } (数学) { r1 = Number(arg1.toString().replace(".", "")); r2 = Number(arg2.toString().replace(".", "")); 戻り値 (r1 / r2) * Math.pow(10, t2 - t1); } } /** ** 正確な加算結果を得るために使用される加算関数** 注: JavaScript の加算結果にはエラーが含まれます。これは、2 つの浮動小数点数を加算する場合に顕著になります。この関数はより正確な加算結果を返します。 ** 呼び出し: accAdd(arg1,arg2) ** 戻り値: arg1 と arg2 の正確な結果 **/ 関数accAdd(arg1, arg2) { var r1、r2、m、c; 試す { r1 = arg1.toString().split(".")[1].length; } キャッチ(e){ r1 = 0; } 試す { r2 = arg2.toString().split(".")[1].length; } キャッチ(e){ r2 = 0; } r1 と r2 の積分 r1 と r2 の積分は、次の式で表されます。 (c > 0) の場合 { var cm = Math.pow(10, c); (r1 > r2)の場合{ arg1 = Number(arg1.toString().replace(".", "")); arg2 = Number(arg2.toString().replace(".", "")) * cm; } それ以外 { arg1 = Number(arg1.toString().replace(".", "")) * cm; arg2 = Number(arg2.toString().replace(".", "")); } } それ以外 { arg1 = Number(arg1.toString().replace(".", "")); arg2 = Number(arg2.toString().replace(".", "")); } (arg1 + arg2) / m を返します。 } /** ** 正確な乗算結果を得るために使用される乗算関数** 注: JavaScript の乗算結果には誤差があり、2 つの浮動小数点数を乗算するとより顕著になります。この関数はより正確な乗算結果を返します。 ** 呼び出し: accMul(arg1,arg2) ** 戻り値: arg1 と arg2 を掛け合わせた正確な結果 **/ 関数accMul(arg1, arg2) { var m = 0、s1 = arg1.toString()、s2 = arg2.toString(); 試す { m += s1.split(".")[1].length; } キャッチ(e){ } 試す { m += s2.split(".")[1].length; } キャッチ(e){ } 戻り値 Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); } 上記はjs精密計算の詳細な内容です。js精密計算の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: サーバー間のファイル バックアップ ソリューション、サーバー ファイルを別のサーバーに自動的にバックアップする方法は?
>>: Linux での MySQL 5.1 および 5.7 のインストール チュートリアル
CSS には、一般的には使用されない 2 つの疑似クラス、before と :after があります...
キャンバスを使用して、参照用の影付きのグラフィックとテキストを作成します。具体的な内容は次のとおりで...
目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...
mysql が閉じない場合の解決策:コンピュータのタスクバーを右クリックしてタスクマネージャーを開き...
1. 父から息子へ子コンポーネントにpropsフィールドを定義し、その型は配列です (フィールド値の...
MySQL を使用する場合、日付は通常、datetime や timestamp などの形式で保存さ...
URL 書き換えは、Web サイトの優先ドメインを決定するのに役立ちます。同じリソース ページの複数...
多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...
昨日プロジェクトを書いていた時に、MySQL の派生版である Percona を使う必要があったので...
この記事では、ドロップダウンメニューを表示および非表示にするJavaScriptの具体的なコードを参...
基本環境パゴダ設置サービスパゴダにインストールされた[Pythonプロジェクトマネージャー]パゴダに...
1. まずmysqld.exeプロセスを停止します2. cmd を開き、mysql の bin ディ...
この記事では、Linux におけるいくつかの主要なゼロコピー テクノロジと、ゼロコピー テクノロジを...
Tomcatの設定まずTomcatをインストールするTomcatのインストールは、Tomcatのイン...
Web デザイナーとして豊富な CSS 経験を持つ私たちは、あらゆる種類のコード構文、互換性、スニペ...