首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript中像Microsoft Excel那样将函数转换为RoundUP

在Javascript中像Microsoft Excel那样将函数转换为RoundUP
EN

Stack Overflow用户
提问于 2010-11-28 00:42:20
回答 1查看 1.4K关注 0票数 0

几天前,我开始了一个项目,其中我需要做一些度量计算;具体地说:统计计算。好吧,这不是问题所在,问题来自于四舍五入浮点数(带小数的数字),以及javascript处理它的方式。我在互联网上找到了一些对javascript数字进行舍入的方法,但没有一种方法能完全替代ms excel所做的事情(ROUND.MAX函数)。所以我必须自己重新创建函数行为。代码是这样的:

代码语言:javascript
复制
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数字一样有效。但是令人惊讶的是,javascript会截断长的浮点数。下一步是做同样的事情,但是要用很长的数字。昨天有人给了我一个链接,我发现这个链接非常有用,但是。我想知道这个函数(EXCEL中的ROUND.MAX)是否已经针对这种大的浮点数实现了。

这是一个示例:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2011-03-30 07:58:55

只需在示例中将round替换为ceil即可获得最大圆角效果:

代码语言:javascript
复制
piii = 3.14159141597;
for(var i = 0; i <= 11; i++) { 
    console.log((Math.ceil((piii*Math.pow(10, i)))/Math.pow(10,i)));
}

输出:

代码语言:javascript
复制
4
3.2
3.15
3.142
3.1416
3.1416
3.141592
3.1415915
3.14159142
3.141591416
3.141591416
3.14159141597
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4292678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档