【问题标题】:Javascript Rounding issuesJavascript 舍入问题
【发布时间】:2013-03-11 10:14:41
【问题描述】:

我试过用这个:

//var value = "39.99";
//var value = "0.255";
var list = ["39.99", "0.255", "0.306", "0.645", "2.505", "5.726", "9.649", "9.999", "10.01", "0.155", "0.355", "10.05", "14.75", "14.02", "2.405", "14.54","2.485"];


var result;

for( i in list ){
    //result = processRounding(parseFloat(list[i]).toFixed(3));
    //result = parseFloat(list[i]).toFixed(2);
    result = test(parseFloat(list[i]).toFixed(3), 2);
    console.log("RESULT["+i+"]: "+ format("#,##0.00", result));
}

function test(value, precision) {
    var precision = precision || 0,
    neg = value < 0,
    power = Math.pow(10, precision),
    value = Math.round(value * power),
    integral = String((neg ? Math.ceil : Math.floor)(value / power)),
    fraction = String((neg ? -value : value) % power),
    padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}


function processRounding (value){
    //console.log( Math.ceil(value*100) + " " +  Math.ceil(value*100) / 2);
    var remainder = parseFloat(value % 1).toFixed(2);
    var floor     = parseInt(Math.floor(value));
    console.log(floor + " " + remainder);
    if(Math.floor(value) != 0 && Math.floor(value) > 10){
        if( parseFloat(remainder) > 0.50 || parseFloat(remainder) > 0.05 ){
            console.log("CEIL");
            value = Math.ceil(value*10)/10;
        }else{
            value = value;
        }          
    }else{
        if( parseFloat(remainder) > 0.50 || parseFloat(remainder) > 0.05 ){
            console.log("ROUND");
            value = Math.round(value*100)/100;
        }else{
            value = value;
        } 
    }

    return value;
}

[jsFiddle here]

但我看到的问题是,当值类似于 "2.405" 时,它的作用很简单,无论我在我的 jsfiddle 示例中使用函数 test 还是函数 processRounding,都将其设为“2.40”。

关于如何将结果变成 2.41 的任何想法?从技术上讲,由于最后一位数字是“5”,因此它应该向上取整。

更新

使用result = test(parseFloat(list[i]).toFixed(3), 2);

var list = ["39.99", "0.255", "0.306", "0.645", "2.505", "5.726", "9.649", "9.999", "10.01", "0.155", "0.355", "10.05", "14.75", "14.02", "2.405", "14.54","2.485"];

会导致这个:

RESULT[0]: 39.99
RESULT[1]: 0.26 
RESULT[2]: 0.31 
RESULT[3]: 0.65 
RESULT[4]: 2.51 
RESULT[5]: 5.73 
RESULT[6]: 9.65 
RESULT[7]: 10.00 
RESULT[8]: 10.01 
RESULT[9]: 0.16 
RESULT[10]: 0.36
RESULT[11]: 10.05
RESULT[12]: 14.75
RESULT[13]: 14.02
RESULT[14]: 2.40
RESULT[15]: 14.54
RESULT[16]: 2.49 

请注意,在列表中有一个“2.405”值,在结果 [14] 中它是“2.40”,它应该是 2.41 对吗?

【问题讨论】:

  • 这把小提琴有很多事情要做。你能在这里发布相关部分吗?

标签: javascript


【解决方案1】:

我想你希望在 JavaScript 中有一个舍入函数。

function trueRound(value, digits){
    return (Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits);
}

可能重复的问题:round off decimal using javascript

【讨论】:

  • 好的,它确实有效。但我的问题是值 39.99 它应该四舍五入到 40 对吗?
  • 将数字四舍五入到最接近的整数:Math.round(x)
  • @Dreyfus15 我刚才测试它的方式就是这样...... trueRound(39.99,1) 返回 40.0
  • 我使用这个 trueRound(parseFloat(value).toFixed(2), 2) 只是因为 0.255 应该四舍五入到 0.26 而不是 0.30
【解决方案2】:

您首先将余数减少到小数点后 2 位:parseFloat(value % 1).toFixed(2);

这意味着当您拥有 2.405 时,其余部分将被解析为 .40,并且无法区分 2.400 和 2.409

如果要正确舍入,则需要保留全部余数。

Roger Ng 有一个很好的解决方案。我只是想解释一下为什么你的从一开始就没有机会工作。

【讨论】:

  • 我也尝试使用 toFixed(3) 来检索 0.405 但相同的结果。
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2013-04-12
  • 2011-08-23
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多