2017-02-15 71 views
1

在我的javaScript程序中解碼大數字,我測試下面的代碼。 輸入:$decodeURIComponent(598697613166239744)如何在uri中使用javascript

輸出:598697613166239700

爲什麼數量變化?我怎麼能避免它?

+0

如[弧](http://stackoverflow.com/questions/42244004/how-to-decode-a-big-number-in- a-uri-using-in-javascript/42244093#42244093)建議,你需要一個庫來處理這樣的數字。我會建議:[decimal.js](https://github.com/MikeMcl/decimal.js) –

+0

我不認爲這個庫可以解決我的問題,因爲我需要一個解碼uri庫。 –

回答

2

這是Javascript中的一般提示。您的編號(598697613166239744)高於JavaScript可以表示的最高安全整數,因爲它的編號爲Double-precision floating-point format

安全意味着它可以被精確和正確地表示。更高的數字被計算並且是估計。所以他們通常是在正確的鄰居,但不完全。

您可以通過運行

console.log(598697613166239744) 
console.log(Number.MAX_SAFE_INTEGER) 

所以問題不是decodeURIComponent()驗證這一點。

爲了解決這個問題要麼收拾這個號碼轉換爲一個字符串或使用可對付這樣的數字

+1

'高於最高存儲號碼' - 你的意思是最高**安全整數** –

0
  1. 庫獲取組件作爲字符串
  2. 該字符串創建一個Decimal.js實例
  3. 使用Decimal.js方法,您現在可以操縱這個龐大的數字。

JSFiddle (The library wouldn't load in SO for some reason, so i had to make a fiddle)

請忽略在小提琴的HTML部分。我在加載庫時遇到了一些問題,所以最後我只是將代碼轉儲到HTML部分。

這裏是SO計算結果爲所述操作的代碼:

var uriComponent = "598697613166239744"; 

var d = new Decimal(uriComponent); 

document.body.innerHTML += "<p>uriComponent: "+ uriComponent + "</p>"; 
document.body.innerHTML += "<p>parseInt will be wrong: "+ parseInt(uriComponent, 10) + "</p>"; 
document.body.innerHTML += "<p>Decimal solution: "+ d.toString() + "</p><br>"; 

document.body.innerHTML += "<p>Decimal operation (divide by 2): "+ d.div(2).toString() + "</p>"; 
document.body.innerHTML += "<p>Decimal operation (multiply by 2): "+ d.mul(2).toString() + "</p>"; 
document.body.innerHTML += "<p>Decimal operation (modulus by 2): "+ d.mod(2).toString() + "</p>"; 
相關問題