2

问题:如果你这样做log1000,你将得到的结果log1000 = 2.9999999999999996不是 3。

我试图在eval()不影响结果准确性的情况下消除 JavaScript 函数中的舍入错误。在格式编号函数中,FormatNumber(strnum)我放置CheckEpsilon(strnum)了哪个测试数字的“右尾”是否大于 epsilon(假设 epsilon 的值是 1e-9,如 C 中一样)

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 回答