js 正確な計算

js 正確な計算
var numA = 0.1; 
var numB = 0.2; 
アラート(numA + numB);

0.1 + 0.2 = 0.300000000000000004 です。
計算精度エラーの問題 (バイナリに関連)。

浮動小数点数の四則演算については、ほぼすべてのプログラミング言語で同様の精度誤差の問題が発生しますが、C++/C#/Javaなどの言語では、精度の問題を回避するためにメソッドがカプセル化されています。JavaScriptは弱い型付けの言語であり、設計思想から浮動小数点数に厳密なデータ型がないため、精度誤差の問題が特に顕著になります。

0.1 と 0.2 をバイナリに変換してみましょう。

0.1 => 0.0001 1001 1001 1001… (無限ループ)

0.2 => 0.0011 0011 0011 0011… (無限ループ)

倍精度浮動小数点数の小数部は最大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の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • js 正確なカウントダウン機能の共有
  • ID番号を確認するための超正確なJavaScriptメソッド
  • js ドラッグ アンド ドロップ テーブルでコンテンツ計算を実現する
  • jsはシンプルな計算機を実装します
  • Apple 電卓の JS 実装
  • JavaScript シミュレーション計算機
  • シンプルな計算機機能を実現するJavaScript
  • JavaScript でテキストの行数を計算する方法
  • JavaScript の典型的なケースのシンプルな計算機

<<:  サーバー間のファイル バックアップ ソリューション、サーバー ファイルを別のサーバーに自動的にバックアップする方法は?

>>:  Linux での MySQL 5.1 および 5.7 のインストール チュートリアル

推薦する

Linux または Windows 環境での pytorch のインストールと検証 (runtimeerror 問題の解決)

1. pytorch公式サイトから対応するインストールファイルをダウンロードします。 https:...

Windows Server2014 にセキュリティを適用して MySQL をインストールする際のエラーに対する完璧な解決策

理由はインストール後にきちんとアンインストールされなかったためです。この問題を解決するには、次の点に...

JavaScript配列についてさらに詳しく知るのに役立つ記事

目次1. 配列の役割: 2. 配列の定義: 1. コンストラクタを通じて配列を作成する2. リテラル...

大きな太陽の天気アイコンを純粋な CSS で記述する方法の例

効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...

ウェブデザインにおけるテキスト入力ボックスのパラメータの説明

<br />一般的なゲストブック、フォーラムなどでは、テキスト入力ボックスが使われていま...

CSS疑似クラス名を数字で始めないでください

初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...

Linux 占有ポートの強制解放と Linux ファイアウォールのポート開放方法の詳しい説明

nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...

Vueは、サイドナビゲーションバーをタブページに関連付けるサンプルコードを実装します。

目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...

ウェブサイトのデザイン体験のための7つの異なるカラースキーム

ウェブサイト構築におけるカラーマッチングは非常に特殊であり、ウェブサイトのテーマ、感情、雰囲気などの...

MySQL Innodb ストレージ構造と Null 値の保存の詳細な説明

背景:テーブルスペース: すべての INNODB データはテーブルスペース (共有テーブルスペース)...

binlog2sql と簡単なバックアップおよびリカバリを使用して mysql8.0.20 を構成するための詳細な手順

目次最初のステップのインストールステップ2: MySQLデータを準備する3 番目のステップは、bin...

HTMLのテーブルの内容は中央に水平と垂直に表示されます

CSSスタイルファイルで指定 #class td /*表のテキストを左右上下に揃えるように設定する*...

VMware15 仮想マシン ブリッジ モードでインターネットにアクセスできない問題の解決方法

説明 ソリューションVMware 15 仮想マシン ブリッジ モードではインターネットにアクセスでき...

3 階層ナビゲーション メニューを実現するための js+css

この記事の例では、3レベルのナビゲーションメニューを実装するためのjs + cssの具体的なコードを...

centos7.2 オフラインインストール mysql5.7.18.tar.gz

ネットワークが分離されているため、MySQL は yum を使用してインストールできません。ここでは...