几天前,我开始了一个项目,我需要做一些测量计算;具体来说:统计计算。好吧,这不是问题,问题来自于舍入浮动数字(带小数的数字),以及javascript处理它的方式。我在互联网上发现了一些舍入javascript数字的方法,但是它们都不是ms excel所做的很好的替代方法(ROUND.MAX函数)。所以我必须自己重新创建这个函数行为。所以这是代码:
MathExt = {
init: function(options){
this.separator = options.separator || ",";
},
roundMax: function(number, decimals){
var $_indexOf = number.lastIndexOf(this.separator);
var fp = number.substring(0, $_indexOf);
var rp = number.substr($_indexOf + 1);
var roundedNumber = "";
if(decimals > 0){
var i = 0;
var _pq = 0;
var _zeros = "";
while(rp.substr(i++, 1) == "0"){ _zeros += "0"; }
i = rp.length - 1;
while(i >= decimals){
var _t = rp.charAt(i);
rp = rp.substring(0, i);
if(_t != "0"){
if(rp.charAt(i - 1) == "9"){ _pq = 1; }
else{
if(_pq == 1) _pq = 0;
rp = _zeros + (parseInt(rp, 10) + 1) + "";
if(i == _zeros.length) _zeros = _zeros.substr(0, i - 1);
}
}
i--;
}
if(_pq == 0)
roundedNumber = fp + this.separator + rp;
else
if(i == 0){
roundedNumber = "" + (parseInt(fp) + 1);
}
else{
rp = (parseInt(rp) + 1) + "";
i = rp.length - 1;
while(i > 0 && rp.substr(i, 1) == "0" ) rp = rp.substr(0, i);
roundedNumber = fp + this.separator + rp;
}
}
else{
var _s = rp.substring(0, 1);
if(_s != "0") fp = "" + (parseInt(fp) + 1);
roundedNumber = fp;
}
return roundedNumber;
}
};
好吧,这段代码的工作方式与我用javascript编号一样。但Surpringly javascript截断长浮动数字。 接下来是做同样的但是数字很长。昨天有人给了我一个我觉得非常有用的链接,但是。我想知道这个函数(来自EXCEL的ROUND.MAX)是否已经为这种大浮点数实现了。
这是一个例子:
piii = 3.14159141597; for(var i = 0; i <= 11; i++){ console.log((Math.round((piii*Math.pow(10, i)))/Math.pow(10,i))); } extracted this from internet.
3
3.1
3.14
3.142
3.1416
3.14159
3.141591
3.1415914
3.14159142
3.141591416
3.141591416
3.14159141597
MS Excel ROUND.MAX FUNCTION
4
3,2
3,15
3,142
3,1416
3,1416
3,141592
3,1415915
3,14159142
3,141591416
3,141591416
3,14159141597
My first version of the ROUND.MAX algorithm
4
3.2
3.15
3.142
3.1416
3.1416
3.141592
3.1415915
3.14159142
3.141591416
3.141591416
3.14159141597
答案 0 :(得分:1)
只需在示例中将round
替换为ceil
即可获得roundmax效果:
piii = 3.14159141597;
for(var i = 0; i <= 11; i++) {
console.log((Math.ceil((piii*Math.pow(10, i)))/Math.pow(10,i)));
}
输出:
4
3.2
3.15
3.142
3.1416
3.1416
3.141592
3.1415915
3.14159142
3.141591416
3.141591416
3.14159141597