如何将一个数字的值增加到10,100,1000,10,000等的下一个倍数

你必须原谅这个问题的措辞,我相信有一个更好,更简洁的方式来问,但我不知道。

比方说,我有一个图,所有的y轴值

[0,4,5,3,2,5,6]

最大值是六。 所以我想Y-Scale从0到10进行标记。

给定以下值

[33,26,54,23,86,23]

最大值是86,所以我希望Y-Scale从0到90。

现在让我们说我有以下值

[98,253,87, 876,263]

最大值是876,所以Y值应该从0到900

现在我已经创build了以下函数,它可以给我所有我需要的最大值。

 function padMaxValue(value){ for(var i = 1; i < 1000000000000000000; i = i * 10){ var decimalValue = value / i; if(value === i){ return i; } if(decimalValue < 1 && decimalValue > 0.09){ return i; } } } 

但是,给出以下值

[99,123,82,189,45]

我的function将y的最大值设置为1000 。 但是,最大值应该是200.我意识到,我真正需要的是一个更智能的方法来增加i的价值,而不是乘以10。我需要能够增加我的价值10,一路然后再增加100,一直增加到1000,然后增加1000,一直增加到10000,等等。

我觉得应该有一些干净整齐的math方法来做到这一点。 而且我也觉得我在循环中的一百1000000000000000000数字背叛了我对math的无知。

无所谓,就是这个问题。 有任何想法吗?

没有必要进入string的地方,如果你有十进制值,这可能是尴尬的。

 function RoundedMax(a) { var mx = Math.max.apply(Math, a); if (mx == 0) {return 0}; var size = Math.floor(Math.log(Math.abs(mx)) / Math.LN10); var magnitude = Math.pow(10, size); var yMax = Math.ceil(mx / magnitude) * magnitude; return yMax; } function RoundedMin(a) { var mn = Math.min.apply(Math, a); if (mn == 0) {return 0}; var size = Math.floor(Math.log(Math.abs(mn)) / Math.LN10); var magnitude = Math.pow(10, size); var yMin = Math.floor(mn / magnitude) * magnitude; return yMin; } var arr = [-9.9,-1.23,-8.2,-2.01,-4.5,0]; document.write(RoundedMax(arr) + " " + RoundedMin(arr)); 

输出: 0 -10

编辑更新鉴于意见。 现在即使在IE8中也可以工作。

我不喜欢math,所以这里是一个非常简单/搞笑的string操作解决scheme:

find最大值:

 var max = Math.max.apply(Math, [98,253,87, 876,263]); // 876 

以其第一个字符

 var c = max.toString()[0] // "8" 

把它作为一个整数并加1

 c = (c | 0) + 1 // 9 

将其转换回string:

 c = c.toString() // "9" 

向其中添加N – 1个零,其中N是原始数字的长度:

 c += Array(max.toString().length).join("0") // "900" 

将其转换回整数:

 c = (c | 0) // 900 

完成!


认真,但使用math 。

我相信这会为你做诡计:

 var data = [98, 253, 87, 876, 263, -155]; var max = Math.max.apply(null, data); // var factor = Math.pow(10, Math.floor(Math.log(Math.abs(max)) / Math.LN10)); if (factor == 0) { factor = 1; } var magnitude = Math.ceil(max / (factor * 1.00)) * factor; 

基本上上面发生的是以下几点:

  1. find样本的最大值
  2. 获得最大值长度,然后将其提高到10的幂即345,长度= 3,因此是100
  3. 确保我们不会被0除
  4. 将最大值除以该因子得到一个小数,然后取该数的上限,然后再乘以该因子得到正确的0。

更新:如果你想find最小值(负值),只需将Math.ceil翻转到Math.floor 。 您还必须取最小值的绝对值,以确保您不会将负数字符作为string的一部分。

 var data = [98, 253, 87, 876, 263, -155]; var min = Math.min.apply(null, data); var factor = Math.pow(10, Math.floor(Math.log(Math.abs(max)) / Math.LN10)); if (factor == 0) { factor = 1; } var mag = Math.floor(min / (factor * 1.00)) * factor // mag = -200; 

更新2:正如很多人在评论中所说的,我们不应该使用string操作。 我更新了代码,而不是使用对数。

我结束了:

 function getGraphRange(data) { var max=Math.max.apply(null, data); var min=Math.min.apply(null, data); var maxDigits=max.toString().length; var minDigits=min.toString().length; var maxD=Math.pow(10,Math.max((maxDigits-1),1)); var minD=Math.pow(10,Math.max((minDigits-1),1)); var maxR=(Math.ceil(max/maxD)*maxD); var minR=(Math.floor(min/minD)*minD); return [minR,maxR]; } alert(getGraphRange([11, 20, 345, 99]).join(' - '));//10-400 alert(getGraphRange([0,4,5,3,2,5,6]).join(' - '));//0-10 alert(getGraphRange([98,253,87,876,263]).join(' - '));//80-900 

http://jsfiddle.net/p4xjs9na/

这里已经有很好的答案了。 我用while循环来解决这个问题。 该function非常快速,即使是非常大的数字,也可以在不到一秒的时间内返回值。

 function padMaxValue(value) { var i = 10; var counter = 0; var roundMax = 10; var copyValue = value; //If the value is negative, convert copyValue to positive if(value < 0) copyValue *= -1; while(roundMax <= copyValue) { roundMax += i; counter++; if(counter == 9) { i *= 10; counter = 0; } } if(value < 0) roundMax *= -1; return roundMax; } document.write(padMaxValue(8) + "<br>"); document.write(padMaxValue(77) + "<br>"); document.write(padMaxValue(889.65) + "<br>"); document.write(padMaxValue(-880.65) + "<br>"); document.write(padMaxValue(-765889.65) + "<br>"); document.write(padMaxValue(7888.88) + "<br>"); document.write(padMaxValue(88999887788899.099887) + "<br>"); 

输出:

10

80

900

-900

-800000

8000

900000亿

我不是math的人,但我认真编程! 我想出了这个解决scheme!

 function getMax(max){ var mCopy = max; var d=1;//Assuming everything is greater than 10, while(Math.floor(mCopy) > 10){//if the number is not one digited mCopy /= Math.pow(10,d); d++; } d--;//back one digit if(d<1) d++; if((Math.floor(max / Math.pow(10,d))*Math.pow(10,d))==max) return max; return Math.floor(max / Math.pow(10,d))*Math.pow(10,d) + Math.pow(10,d); } 

希望这可以帮助

在我看来,给出的答案过于复杂。 这是一个可以在MATLAB中使用的匿名函数:

 next = @(x,n) ceil(x/n)*n; >> next(11,10) ans = 20 %# 20 is the next "10" after "11") >> next(110,100) ans = 200 %# 200 is the next "100" after "110" >> next([98,253,87, 876,263],100) ans = 100 300 100 900 300 

x是应该处理的数字, n是请求的步长。

编辑确定下一个数量级的自动化也是可能的

 >> nextOrder = @(x) ceil(x/10.^ceil(log10(x))) * 10.^ceil(log10(x)); >> nextOrder([98,253,87,876,263]) ans = 100 1000 100 1000 1000