6

如果数字是37,我希望它四舍五入到40,如果数字是1086,我希望它四舍五入到2000。如果数字是453992,我希望它四舍五入到500000。

我真的不知道如何更笼统地描述这个,对不起,但基本上,最高位的数字应该总是四舍五入到最接近的数字,其余的都变成零。我知道如何正常地四舍五入,我只是不知道如何干净地处理位数之间的变化。

谢谢,

编辑:我删除了 4 到 10 轮,因为那一轮似乎不适合其余的,而且它不是真的必要。

4

6 回答 6

8

假设所有值都是正整数:

function roundUp(x){

    var y = Math.pow(10, x.toString().length-1);

    x = (x/y);
    x = Math.ceil(x);
    x = x*y;
    return x;
}

现场演示:http: //jsfiddle.net/fP7Z6/

于 2013-04-09T15:40:56.923 回答
3

我会使用以下功能

function specialRoundUp(num) {
    var factor = Math.pow(10, Math.floor(Math.log(num) / Math.LN10));
    return factor * Math.ceil(num/factor);
}
于 2013-04-09T15:48:01.263 回答
3

我的花哨版本可以正确处理小数和负数,并按照 OP 的要求正确四舍五入到最接近的 10 次方:

roundToNearestPow(value) {
    var digits = Math.ceil(Math.log10(Math.abs(value) + 1));
    var pow = Math.pow(10, digits - 1);

    return Math.round(value / pow) * pow;
}

// roundToNearestPow(-1499.12345) => 1000
// roundToNearestPow( 1500.12345) => 2000
于 2016-09-21T10:10:39.027 回答
0

获取原数的长度:

var num;
var count = num.toString().length;

获取第一个数字:

var first = num.toString().substring(0, 1);

然后只需先 ++ 并添加 count-1 个零

来自评论

确保 number 不是 10 的乘积:

if((num % 10) != 0)
{
    //do all above in this closure
}
于 2013-04-09T15:37:21.530 回答
0

我读起来像nearest integer, which is production of an integer and some power of 10

你可以通过

var myCeil = function(num){
  var power = Math.log(num,10) * Math.LOG10E;
  var head = Math.floor(power);
  var rest = power - orig;
  return Math.ceil(Math.pow(10,next))*Math.pow(10,orig);
}
i = [37, 1086, 453992];
console.log( i.map(myCeil) );
// -> [ 40, 2000, 500000 ]

这也适用于非整数输入。

于 2013-04-09T15:50:11.080 回答
0

如果你想四舍五入到 10 的最近幂,试试这个(javascript)

function Round2NearestPowerOf10(x) {
    x = Math.round(x);
    var strLen = x.toString().length;
    var y = x / Math.pow(10, strLen);
    var rst = Math.pow(10, strLen - 1 + Math.round(y));
    return rst < 10 ? 10 : rst;
}

结果将四舍五入到 10,100,1000 等。

于 2014-06-03T07:30:37.673 回答