2012-04-30 25 views

回答

9

這是由於浮動Number類型的點精度。 Flash僅使用64位來表示Math.pow(97,83)的結果,其中53個用於描述浮點數的尾數部分。使用53位時,您只需要在數字上得到大約15-16位數的精度,然後您需要將其舍入。由於Math.pow(97,83)是一個大約164位數字的數字,因此Flash保留近似形式7.98093813043768e + 164

這不是Math.pow(97,83)的確切值,因爲精度下降,因此在計算mod時會產生不好的結果。

Wolfram-Alpha可能使用專門的庫來計算大數字而不會損失精度。我不知道任何這樣的動畫庫3,但谷歌可能會幫助那裏;)

+3

谷歌搜索 「AS3的BigInteger」 將產生一些相關結果。 –

+0

我googled as3 biginteger和我碰到as3crypto:|它有點難以理解它是如何工作的,因爲我這樣做: var a:BigInteger = new BigInteger(「50」,10); trace(a.toString(10)); 答案是280.我可以使用任何其他庫嗎? –

1

雖然你有@Godfather在那裏的正確答案,這裏是我的5美分。

var test:String = ""; 

// a binary number with bit 53 up 
test += "10000000"; // 8 
test += "00000000"; // 16 
test += "00000000"; // 24 
test += "00000000"; // 32 
test += "00000000"; // 40 
test += "00000000"; // 48 
test += "00000"; // 53 

trace("test", test); 
trace(parseInt(test, 2).toString(2) == test); // true 

test += "1"; // bit 0 and 54 up, the rest -- down 

var chck:String = parseInt(test, 2).toString(2); 
trace("test", test); 
trace("chck", chck); 
trace(chck == test); // false 

這產生了:

test 10000000000000000000000000000000000000000000000000000 
true 
test 100000000000000000000000000000000000000000000000000001 
chck 100000000000000000000000000000000000000000000000000000 
false 

所以,你可以使用整數高達

dec: 9007199254740991 
hex: 1FFFFFFFFFFFFF 
bin: 11111111111111111111111111111111111111111111111111111 

這裏是另外一個例子:

trace(parseFloat("9007199254740993") == parseFloat("9007199254740992")); 
// output: true 
+0

做什麼,跟蹤(chck ==測試); ??你可以請一些燈光。我很好奇,但不明白。 –

+0

'test'只是一個0和1個字符的字符串。 'parseInt()'用於將字符串'test'轉換爲數字。我所做的是將'test'轉換爲數字,*轉換回字符串*。轉換結果保存爲'chck'。然後,我比較來回轉換測試的結果。結果不匹配,因此我們已經達到了整個數字的極限。 –

+0

感謝您的回答:)...您的建議是什麼?我是否應該將整數分解爲能夠執行該功能的整數? –

相關問題