将Flash CS4与Actionscript 3一起使用我输入以下内容:
trace(Math.pow(97,83) % 205);
结果是86.但是如果我输入Wolfram-Alpha:
97^83 mod 205
我得到13这是正确的答案。为什么动作脚本显示错误的值?
谢谢, Y_Y
答案 0 :(得分: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可能使用专门的库来计算大数而不会损失精度。我不知道ActionScript 3的任何此类库,但谷歌可能会帮助那里;)
答案 1 :(得分:2)
因为97^83
的结果太大而无法在AS3中正确计算。
见http://en.wikipedia.org/wiki/IEEE_754-2008
答案 2 :(得分: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