2

問題:結果を実行すると、3 ではなくlog1000結果が得られます。log1000 = 2.9999999999999996

eval()結果の精度に影響を与えることなく、JavaScript 関数のこの丸め誤差を除去しようとしました。数値の「右端」がイプシロンよりも大きいかどうかをテストする形式の番号付け関数FormatNumber(strnum)に入れます(イプシロンの値がCのように1e-9であると仮定します)CheckEpsilon(strnum)

function FormatNumber(strnum) {
// asf - number format: automatic(0), scientific(1) or fixed(2) notation
// decimal - number of decimal places(0-15)

    // First we must check if the right tail is bigger than epsilon
    strnum = CheckEpsilon(strnum);
    // And then we format the number
    var x = parseFloat(strnum);

    switch(asf) {
        case 0:     // auto
            strnum = x.toPrecision();
            break;
        case 1:     // sci
            strnum = x.toExponential(decimal);
            break;
        case 2:     // fix
            strnum = x.toFixed(decimal);
            break;
    }

    return strnum;
}

function CheckEpsilon(strnum) {
// EPSILON  - Difference between 1 and the least value greater than 1 that is representable.

    var epsilon = 1e-8;
    var x = parseFloat(strnum);

    var expnum = x.toExponential(17);
    // Last 10 numbers before the exponent (9 if the number is negative)
    // we turn in to a new decimal number ...
    var y = parseFloat("0." + expnum.slice(9,19));

    // and then we compare it to epsilon (1e-8)
    // If y (or 1-y) is smaller than epsilon we round strnum
    if (y<epsilon || (1-y)<epsilon) {
        strnum = x.toExponential(10);
    }

    //and if it isn't, strnum is returned as normal
    return strnum;
}

関数の実用的なショーケースに興味がある場合は、私が作成した電卓を参照してください (JavaScript で作成されているため、コードを簡単に確認できます)。リンクはhttp://www.periodni.com/calculator.htmlです。

これは私が行った方法ですが、私の実際の質問は次のとおりです。これを行うより良い方法を知っている人はいますか?

4

1 に答える 1

0

toFixed(2)次のように使用します。

var rounded = originalvar.toFixed(2);
于 2014-01-30T12:56:23.890 に答える