为什么我不能在不损失JS精度的情况下将字符串转换为数字?

时间:2018-08-23 11:08:58

标签: javascript string numbers

我们都知道+, Number()parseInt()可以将字符串转换为整数。
但就我而言,我的结果很奇怪。
我需要将字符串'6145390195186705543'转换为数字。

let str = '6145390195186705543';
let number = +str; // 6145390195186705000, but should be: 6145390195186705543 

有人可以解释为什么以及如何解决吗?

4 个答案:

答案 0 :(得分:2)

我猜这是要解决leetcode中的plusOne问题。正如其他人回答的那样,您不能存储大于最大安全整数的值。但是,您可以编写逻辑来手动添加值。 如果要在数组中表示的数字上加一个,可以使用以下函数。如果需要添加其他值,则需要对解决方案进行一些调整。

var plusOne = function(digits) {
    let n = digits.length, carry=0;
    if(digits[n-1]<9){
        digits[n-1] +=1;        
    } else{
        digits[n-1] = 0;
        carry=1;
        for(let i=n-2;i>=0;i--){
            if(digits[i]<9){
                digits[i]+=1;
                carry=0;
                break;
            }else{
                digits[i]=0;
            }
        }
        if(carry>0){
            digits.unshift(carry);
        }
    }
    return digits;  
};

答案 1 :(得分:1)

您的电话号码高于Number.MAX_SAFE_INTEGER(9,007,199,254,740,991),这意味着js可能很难很好地表示出来。

More information

答案 2 :(得分:1)

您超出了最大范围。输入Number.MAX_SAFE_INTEGER

来检入控制台

如果您想要一个超出此范围的数字,请查看BigInt,它可以定义超出安全范围的数字

https://developers.google.com/web/updates/2018/05/bigint

使用前请仔细阅读文档,因为用法与平常不同

答案 3 :(得分:1)

简短的回答:您的字符串表示一个数字,该数字要大一些以适合JavaScript数字容器。

根据javascript文档,最大安全数字为2 ^ 53,这是9007199254740992来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number 当您尝试转换您的数字时,您正在创建溢出异常,因此您会得到奇怪的结果。