Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:数字的独立位置值_Javascript - Fatal编程技术网

Javascript:数字的独立位置值

Javascript:数字的独立位置值,javascript,Javascript,我想要一个函数,可以接受一个数字(比如1000.43)并返回十、百、千和小数部分。因此,在1000.43中,它可能会返回一个带有[1000,0,0,43]的数组。我知道这听起来很难,但我该怎么做呢。也许你可以给我一些建议如何做到这一点,或者可以提供我的代码。无论哪种方法都非常受欢迎。首先,您可以使用floor()删除小数部分,然后减去: function splitToParts(n) { var wholePart = Math.floor(n); var decimalPar

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

首先,您可以使用
floor()
删除小数部分,然后减去:

function splitToParts(n) {
    var wholePart = Math.floor(n);
    var decimalPart = n - wholePart;
}
然后,您只需继续除以
10
,直到
n
0
,然后将其推入(嗯,
unshift
ing)数组:

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
,以避免无限循环


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

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}

首先,您可以使用
floor()
并减去以下内容来删除小数部分:

function splitToParts(n) {
    var wholePart = Math.floor(n);
    var decimalPart = n - wholePart;
}
然后,您只需继续除以
10
,直到
n
0
,然后将其推入(嗯,
unshift
ing)数组:

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
,以避免无限循环


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

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}

这是最短但最完整的实现:

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]
功能部件(d){
var num=(d+“”).split(“”)
,array=array.prototype.slice.call(num[0])
,零=“”;

对于(var i=array.length-2;0这是最短但完整的实现:

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]
功能部件(d){
var num=(d+“”).split(“”)
,array=array.prototype.slice.call(num[0])
,零=“”;

对于(var i=array.length-2;0首先检查
并拆分该字符串。如果其为十进制,则将其添加到数组中。然后使用
unshift
反向循环将每个数字添加到数组的开头。同样,在循环中,如果计数器从零开始,则该数字是必须添加的零数d到数字。所以一些示例代码

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));
}
var num='1234.5';
var-arr=[];
num=num.split('.');
如果(数字[1]!=''){
arr.unshift(num[1]);
}
part=num[0],len=part.length,零=000000000000;

对于(var i=0;i首先检查
并拆分该字符串。如果它们是十进制数,则将其添加到数组中。然后使用
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));
}
var num='1234.5';
var-arr=[];
num=num.split('.');
如果(数字[1]!=''){
arr.unshift(num[1]);
}
part=num[0],len=part.length,零=000000000000;

对于(var i=0;i它应该很简单-有多少个单位,几十个,几百个,几千个

只要注意小数点就可以了

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
*/

它应该很简单-有多少个单位,几十个,几百个,几千个

只要注意小数点就可以了

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
*/
可以像这样使用模(%)

    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;
}
函数拆分编号(num){
var len=num.toString().split('.')[0].length,//获取小数点以上的长度
d=数学功率(10,len),
a=[];
对于(变量i=0;i1){
d/=10;
a、 推(数学地板(x/d));
}否则{
//小数点以下
a、 推(x);
}
}
返回a;
}
您可以像这样使用模(%)

    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;
}
函数拆分编号(num){
var len=num.toString().split('.')[0].length,//获取小数点以上的长度
d=数学功率(10,len),
a=[];
对于(变量i=0;i1){
d/=10;
a、 推(数学地板(x/d));
}否则{
//小数点以下
a、 推(x);
}
}
返回a;
}

对于1000.43,数组不是
[1000,0,0,43]
?那么一个人的位置呢?1234.234是什么-你需要将小数部分分成十分之一/百分之一/千分之一吗?它是[1000,200,30,4,234]?实际上,它是
[1,0,0,43]
。相关:对于1000.43,数组不是
[1000,0,0,43]
?那么一的位置呢?1234.234应该是什么-你需要将小数部分分成第十/第一百/千分之一吗?它是[1000,200,30,4,234]?实际上,它应该是
[1,0,0,43]
.Related:@David:确保您测试了最新版本-出现了一个bug:p当我执行
拆分部分(4314.23);
它会给我
[4000,300,10,4,0.2299999999956344]
JavaScript不能很好地处理浮点数。在这种情况下,字符串操作可能是首选的,因为
拆分部分(10.43)
返回
[10,0.4299999999997]
@David:是的,标准不能准确地表示某些数字。你必须将它们四舍五入到合理的范围内。“解释为什么会这样”.我为你做什么?什么让你有权要求我做点什么?学点礼貌!答案是在谷歌上对浮点运算不准确性的任何基本解释。或者读一本关于数值分析的书。从本质上说,精确度的损失来自于你这里的参数太大这一事实为了保持精度,会有一些精度损失(相对于要减去的数字有多大)。@David:确保测试最新版本-有一个错误:p当我执行
splitToParts(4314.23);
它给了我
[4000,300,10,4,0.2299999956344]
JavaScript不能很好地处理浮动p