Javascript智能取整

Javascript智能取整,javascript,math,rounding,Javascript,Math,Rounding,我现在需要将数字四舍五入到最接近的主数字。(不确定此处的正确术语) 但请看一个我正在努力实现的例子 IE: 13 // 20 349 // 400 5645 // 6000 9892 // 10000 13988 // 20000 93456 // 100000 231516 // 300000 etc. etc. 我已经实现了这样做的一种方法,但它太痛苦了,只能处理高达一百万的数字,如果我想让它走得更高,我需要添加更多的if语句(是的,请看我是如何实现它的:我不是很骄傲,但

我现在需要将数字四舍五入到最接近的主数字。(不确定此处的正确术语)

但请看一个我正在努力实现的例子

IE:

 13 // 20
 349 // 400
 5645 // 6000
 9892 // 10000
 13988 // 20000
 93456 // 100000
 231516 // 300000

etc. etc.
我已经实现了这样做的一种方法,但它太痛苦了,只能处理高达一百万的数字,如果我想让它走得更高,我需要添加更多的if语句(是的,请看我是如何实现它的:我不是很骄傲,但大脑被卡住了)


肯定已经有了一些东西,但谷歌并没有给我很大帮助,可能是因为我不知道我想要做的那种舍入的正确术语

你可以使用Math.ceil函数,如下所述:

要正确地计算数字,您必须将它们除以10(如果它们有2位数字)、100(如果它们有3位数字),依此类推……


<script type="text/javascript">
    function intelliRound(num) {
        var len=(num+'').length;
        var fac=Math.pow(10,len-1);
        return Math.ceil(num/fac)*fac;
    }
    alert(intelliRound(13));
    alert(intelliRound(349));
    alert(intelliRound(5645));
    // ...
</script>
函数intelliRound(num){ 变量len=(num+“”).length; var fac=数学功率(10,len-1); 返回Math.ceil(num/fac)*fac; } 警报(智能轮(13)); 警报(智能轮(349)); 警报(智能轮(5645)); // ...
见单程

var a = [13, // 20
 349, // 400
 5645, // 6000
 9892, // 10000
 13988, // 20000
 93456, // 100000
 231516 // 300000
]

for (var i in a) {
    var num = a[i];
    var scale = Math.pow(10, Math.floor(Math.log(num) / Math.LN10));
    print([ num, Math.ceil(num / scale) * scale ])
}

13,20
349,400
5645,6000
9892,10000
13988,20000
93456,100000
231516,300000
工作正常,但对于那些需要处理负数的人,这里有一个更新版本:

函数intelliRound(num){
变量len=(num+“”).length;
var结果=0;
if(num<0){
var fac=数学功率(10,len-2);
结果=数学地板(数量/fac)*fac;
}
否则{
var fac=数学功率(10,len-1);
结果=数学单元(num/fac)*fac;
}
返回结果;
}
警报(智能轮(13));
警报(智能轮(349));
警报(智能轮(5645));
警报(智能轮(-13));
警报(智能轮(-349));

警报(智能轮(-5645))来自其他答案的intelliRound函数运行良好,但以负数中断。在这里,我扩展了这些解决方案,以支持小数(例如0.123,-0.987)和非数字:

/**
 * Function that returns the floor/ceil of a number, to an appropriate magnitude
 * @param {number} num - the number you want to round
 *
 * e.g.
 * magnitudeRound(0.13) => 1
 * magnitudeRound(13) => 20
 * magnitudeRound(349) => 400
 * magnitudeRound(9645) => 10000
 * magnitudeRound(-3645) => -4000
 * magnitudeRound(-149) => -200
 */

function magnitudeRound(num) {
  const isValidNumber = typeof num === 'number' && !Number.isNaN(num);
  const result = 0;

  if (!isValidNumber || num === 0) return result;
  const abs = Math.abs(num);
  const sign = Math.sign(num);

  if (abs > 0 && abs <= 1) return 1 * sign; // percentages on a scale -1 to 1
  if (abs > 1 && abs <= 10) return 10 * sign;
  const zeroes = `${Math.round(abs)}`.length - 1; // e.g 123 => 2, 4567 => 3
  const exponent = 10 ** zeroes; // math floor and ceil only work on integer
  const roundingDirection = sign < 0 ? 'floor' : 'ceil';

  return Math[roundingDirection](num / exponent) * exponent;
}

/**
*函数,该函数将数字的下限/上限返回到适当的大小
*@param{number}num-要舍入的数字
*
*例如。
*震级圆形(0.13)=>1
*震级圆形(13)=>20
*震级圆形(349)=>400
*震级(9645)=>10000
*震级圆形(-3645)=>-4000
*震级舍入(-149)=>-200
*/
函数大小圆形(num){
const isValidNumber=typeof num=='number'&&!number.isNaN(num);
常数结果=0;
如果(!isValidNumber | | num==0)返回结果;
常数abs=数学值abs(num);
常量符号=数学符号(num);
如果(abs>0&&abs 1&&abs 2,4567=>3
常数指数=10**零;//数学下限和ceil仅适用于整数
const roundingDirection=符号<0?'floor':'ceil';
返回数学[roundingDirection](数值/指数)*指数;
}

我需要一个女朋友,但我们可能需要努力才能把事情办好!用349->400代替500、13988->20000代替15000、231516->300000代替250000的逻辑是什么?!@Bakudan特里斯坦发布的例子有一个逻辑。本质上,你把数字简化为一个有效数字,总是四舍五入。@cheeken这是一个比我用的更好的术语!意义重大digit@cheeken我想知道的是高利润率的模式。可能有一些隐含的逻辑。非常简单!我的大脑工作正常!看着这个,我想知道我怎么会错过这个!