-1

重複の可能性:
JavaScript の浮動小数点演算は壊れていますか?

JavaScript での乗算中に奇妙な数学的問題が発生しました。

$(parent).find('#id_deals-' + i + '-quantity').val()

結果 -> 10

$(parent).find('#id_deals-' + i + '-price').val()

結果 -> 3.99

上記の両方を次のように乗算します。

$(parent).find('#id_deals-' + i + '-price').val() * $(parent).find('#id_deals-' + i + '-quantity').val()

結果 --> 39.900000000000006

なぜこうなった?小数点以下の桁数を 2 桁に制限するにはどうすればよいですか?

10 は 10.0 でなければならないからでしょうか? しかし、実際の乗算の前に値をこの形式に自動的に変換するにはどうすればよいですか?

更新: syazdani の回答によると、提案されているように bigdecimal を実装しようとしました:

十分に文書化されていませんが、次のように機能しました。

function run(opts) {
    var bd = {"BigDecimal":BigDecimal, "BigInteger":BigInteger, "RoundingMode":RoundingMode};
    var result;
    var ops = {'*': "multiply", '/': "divide", '+': "add", '-': "subtract"};
    var a = new bd.BigDecimal("" + opts.a);
    var b = new bd.BigDecimal("" + opts.b);
    var op = ops[opts.op];
    if (op == "divide") {
        return a.divide(b, 300, bd.RoundingMode.HALF_UP());
    } else {
        return a[op].call(a, b);
    }
}


function multiply(a, b){
    return run({"a":a,"b":b,"op":"*"}); 
} 
4

3 に答える 3

2

通貨を扱っている場合 (「価格」ID が与えられているように見えるため)、いわゆる Big Number ライブラリ (次のようなもの: https://github.com/iriscouch/ bigdecimal.js ) を使用して、数学を制御します (切り上げと切り捨てなど)。すべてを正しく行うにはもう少し作業が必要ですが、オフィス スペースの計算シナリオは避ける価値があります。

于 2013-01-22T17:44:59.570 に答える
1

すべての JavaScript 数値は、IEEE-754 倍精度浮動小数点数です。つまり、丸め誤差と不正確さが問題になります。

于 2013-01-22T17:39:00.990 に答える
0

javascriptのすべての数値は、 IEEE754に基づく浮動小数点数です。

ドットの後に固定桁数の文字列としてフォーマットする場合は、次を使用します。

var formattedNumber = v.toFixed(2); // this makes a string
于 2013-01-22T17:39:27.227 に答える