2017-04-05 25 views
0

考慮以下字符串數組:轉換的數字數組多項

["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"] 

我寫這減少了代碼,試圖將數組轉換爲數字(不使用任何內置的解析器)。

d.reduce((res,n,idx)=>{ 
    res *= 10; 
    res += n.charCodeAt(0) - 48; 
    console.log(res); 
    return res; 
},0); 

這裏是日誌:

9 
93 
933 
9333 
93338 
933385 
9333852 
93338527 
933385270 
9333852702 
93338527022 
933385270222 
9333852702227 
93338527022279 
933385270222798 
9333852702227988 

933385270222798(8)< - 應該是7

我注意到9333852702227980 + 7 = 9333852702227988

的代碼去的時候這個數字很大,我猜測我已經超出了安全Integer界限。我怎樣才能解決這個問題?

+1

正如你猜測的那樣,你已經超出了['Number.MAX_SAFE_INTEGER']的範圍(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) ,這是'9007199254740991'或'(2 ** 53)-1',所以你失去了精度。 – 2017-04-05 12:20:52

+0

'var num = nums.reduce((p,c)=> 10 * p ++ c);還有如@squint所述,如果總和超過最大安全整數限制,那麼結果就不再安全。 – Redu

+0

那麼,是否有可能解析JS中MAX_SAFE_INTEGER數字較大的數字? –

回答

-3

var arr = ["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"]; 
 
var num = 0; 
 

 
for (a = arr.length - 1; a >= 0; a--) { 
 
    num += arr[a] * Math.pow(10, (arr.length - 1) - a); 
 
} 
 

 
Number.prototype.add = function(x) { 
 
    var out = 0; 
 
    for (a = arr.length - 1; a >= 0; a--) { 
 
    out += (arr[a] * 1 + (x[(arr.length - 1) - a] || 0) * 1) * Math.pow(10, (arr.length - 1) - a); 
 
    } 
 
    return out; 
 
} 
 

 
console.log(num); 
 
console.log(num.add('7'));

+1

'Number'也是一個內置的解析器。您的第一個結果日誌顯示了同樣的精度損失。 – 2017-04-05 12:28:57

+0

我正在接近... – Tom

+0

是的,我一直在玩弄你的榜樣,因爲它似乎給出了預期的結果。我只是不知道它實際上可以完成,因爲整數僅用53位表示,所以我不知道如何失去精度。但是,如果有一些技巧,它會非常有趣。 – 2017-04-05 12:42:09

-1

考查任意精度整數運算包,例如Big NumbersBig,或Crunch。他們應該給你一些關於如何推出自己的想法。