【问题标题】:Javascript: separate place values of a numberJavascript:数字的单独位置值
【发布时间】:2025-11-27 00:55:01
【问题描述】:

我想要一个可以接受数字(比如 1000.43)并返回十、百、千和小数部分的函数。所以在 1000.43 中,它可能会返回一个带有 [1000, 0, 0, .43] 的数组。我知道这听起来很难,但我该怎么做。也许您可以就如何做到这一点给我一些建议,或者可以向我提供代码。无论哪种方式都非常感谢。

【问题讨论】:

  • 对于 1000.43,数组不会是 [1000, 0, 0, .43] 吗?那个人的地方呢?
  • 什么是 1234.234 - 你需要将小数部分分成十/百/千吗?会是 [1000, 200, 30, 4, .234] 吗?
  • 其实应该是[1,0,0,.43]

标签: javascript


【解决方案1】:

首先,您将使用floor() 并减去小数部分:

function splitToParts(n) {
    var wholePart = Math.floor(n);
    var decimalPart = n - wholePart;
}

然后,您只需继续除以10 直到n0,然后将其推入(嗯,unshifting)到一个数组中:

function splitToParts(n) {
    var wholePart = Math.floor(n);
    var decimalPart = n - wholePart;
    var parts = [];
    var multiplier = 1;

    while(wholePart > 0) {
        var result = wholePart % 10;

        if(result > 0) {
            parts.unshift(result * multiplier);
        }

        wholePart = Math.floor(wholePart / 10);
        multiplier *= 10;
    }

    if(decimalPart) {
        parts.push(decimalPart);
    }

    return parts;
}

您可能还想检查Infinity-Infinity,以避免无限循环。


哦,这是一个打高尔夫球的版本,因为我想:

function(n,p,r,m,x){for(r=[n-(n|0)],n=n|0,m=1;n;n=n/10|0,m*=10)(x=n%10)?r.unshift(x*m):0;return r}

【讨论】:

  • @David:确保您测试了最新版本 - 有一个错误:P
  • 当我这样做时splitToParts(4314.23); 它给了我[4000, 300, 10, 4, 0.22999999999956344]
  • JavaScript 不能很好地处理浮点数。在这种情况下可能首选字符串操作,因为splitToParts(10.43) 返回[10, 0.4299999999999997]
  • @David:是的,标准不能准确地表示某些数字。您必须将它们四舍五入到合理的值。
  • “解释为什么会这样”。我为你工作什么?你有什么权利要求我做点什么?学习一些礼仪!答案在谷歌上浮点算术不准确性的任何基本解释中。或者读一本关于数值分析的书。本质上,准确性的损失来自这样一个事实,即您的参数量级太大而无法保留准确性,因此存在一些精度损失(相对于您要减去的数字有多大)。
【解决方案2】:

这是最短但完整的实现:

function parts(d) {
    var num = (d+'').split('.')
      , array = Array.prototype.slice.call(num[0])
      , zeros = '';
    for (var i = array.length-2; 0 <= i; i--) {
        zeros += '0';
        if (array[i] !== '0') array[i] = array[i] + zeros;
    }
    if (num[1]) array.push('.' + num[1]);
    return array;
}
// Example:
parts(10.4); // [10, 0, .4]

【讨论】:

  • 这不是最短的,也不是 OP 所寻找的。 ["1", "0", "0", "0", 0.42999999999995] !== [1000, 0, 0, .43]
  • 我需要它来返回数百、十和个。所以我的意思是,从你的例子来看,parts(10.4) 应该返回[10, 0, .4];
  • @RobW,你在开玩笑吧?是什么让您认为 OP 在回复您?那里还有另外两个 cmets,证据(OP 对问题的编辑)表明他同意 another 评论。
  • @davin OP 没有回复我,除了这个答案。我指出了问题的评论,以显示我是如何构建初始答案的。
【解决方案3】:

首先检查. 并在其上拆分字符串。如果它们是小数,则将其添加到数组中。然后使用unshift 向后循环将每个数字添加到数组的开头同样在你的循环中,如果你的计数器从零开始,那么这个数字就是你必须添加多少个零。所以一些示例代码。

var num = '1234.5';
var arr=[];

num = num.split('.');

if(num[1]!==''){
  arr.unshift(num[1]);
}
part=num[0],len=part.length,zeroes='000000000000';
for(var i=0;i<len;i++){
  var digit = part.substr(len-i-1,1);
  arr.unshift(digit+zeroes.slice(0,i));
}

【讨论】:

    【解决方案4】:

    应该很简单——多少个单位,几十个,几百个,几千个......

    请注意浮动在你身上的小数。

    function tithe(n){
        if(!isFinite(n)) return NaN;
        n= Math.abs(n);
        var A= [], I= Math.floor(n),
        dec= String(n).split('.')[1],
        x= 1, t;
        while(I/x> 0){
            t= I%(x*= 10);
            I-= t;
            A.unshift(t);
        }
        if(dec) A.push(+dec);
        return A;
    }
    tithe(12022045.554)
    
    /*  returned value: (Array)
    10000000,2000000,0,20000,2000,0,40,5,554
    */
    

    【讨论】:

      【解决方案5】:

      你可以像这样使用模数 (%)

          var num = 1573.64;
          var th = Math.floor((num % 10000) / 1000),
                  h = Math.floor((num % 1000) / 100),
                  t = Math.floor((num  % 100) / 10),
                  u = Math.floor(num % 10),
                  d = num % 1;
      
          console.log(th, h, t, u, d);
      

      写成函数可能是这样的

      function splitNumber(num) {
      
              var len = num.toString().split('.')[0].length, //get length above decimal point
                  d = Math.pow(10, len),
                  a = [];
      
              for (var i = 0; i < len+1; i++) {
                  var x = num % d;
                  if (d > 1) {
                      d /= 10;
                      a.push(Math.floor(x / d));
                  } else {
                      //below decimal point
                      a.push(x);
                  }
              }
              return a;
      }
      

      【讨论】: