下面的程序计算262 + 261 + 260 + ... + 21 + 20。
使用double
类型存储sum
:
double sum = 0;
for (int i = 0; i < 63; i++) {
sum += pow(2.0, i);
// print("i : $i sum : $sum");
}
print(sum);
输出:
9223372036854776000.0
很明显,答案应该是一个odd
数,但sum
是:9223372036854776000.0
是一个even
数。
当我将sum改为int数据类型时,它会给出准确的结果:
使用int
类型存储sum
:
int sum = 0;
for (int i = 0; i < 63; i++) {
sum += pow(2.0, i).toInt();
//print("i : $i sum : $sum");
}
print(sum);
输出:
9223372036854775807
当数据类型为double时,为什么求和会产生错误的结果?
1条答案
按热度按时间qxgroojn1#
因为
double
的有效位只有53位,而你的数字有63位。52存储在主有效数字段中,53位二进制小数的前导
1
位是隐式的。