将 Flash CS4 与 Actionscript 3 一起使用,我键入以下内容:
trace(Math.pow(97,83) % 205);
结果为 86。但是,如果我输入 Wolfram-Alpha:
97^83 mod 205
我得到 13 这是正确的答案。为什么 actionscript 显示错误的值?
谢谢,Y_Y
将 Flash CS4 与 Actionscript 3 一起使用,我键入以下内容:
trace(Math.pow(97,83) % 205);
结果为 86。但是,如果我输入 Wolfram-Alpha:
97^83 mod 205
我得到 13 这是正确的答案。为什么 actionscript 显示错误的值?
谢谢,Y_Y
这是由于 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 有任何此类库,但谷歌可能会在那里提供帮助;)
因为结果97^83
太大而无法在 AS3 中正确计算。见http://en.wikipedia.org/wiki/IEEE_754-2008
虽然您在上面有@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