在ActionScript3中使用Flash CS4时,我键入以下内容:
trace(Math.pow(97,83) % 205);结果是86。但是,如果我键入Wolfram-Alpha:
97^83 mod 205我得到13分,这是正确的答案。为什么actionscript显示错误的值?
谢谢,Y_Y
发布于 2012-04-30 17:49:53
这是由于Number类型的浮点精度所致。Flash仅使用64位来表示Math.pow(97,83)的结果,其中53位用于描述浮点数的尾数部分。使用53位,在需要对一个数字进行四舍五入之前,您只能获得大约15-16位的精度。由于Math.pow(97,83)是一个大约164位数长的数字,因此闪存保持形式7.98093813043768e+164的近似值
由于精度的损失,这不是Math.pow(97,83)的精确值,因此在计算mod时会产生不好的结果。
Wolfram-Alpha可能使用了一个专门的库来计算大量数字,而不会损失精度。我不知道ActionScript3有这样的库,但google可能会在那里提供帮助;)
发布于 2012-04-30 17:51:10
因为97^83的结果太大了,在AS3中无法正确计算。请参阅http://en.wikipedia.org/wiki/IEEE_754-2008
发布于 2012-04-30 23:16:01
虽然你有一个正确的答案@教父在那里,这是我的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: truehttps://stackoverflow.com/questions/10380824
复制相似问题