较早的帖子指的是存储非终止数字或精度大于可以存储在double中的数字的问题。我的例子中的数字是终止小数,终止于第二个有效数字。
我有以下C代码,我已经在IDEONE.com和NetBeans中测试过,两者都给了我相同的输出。我还在三台不同的计算机上进行了测试:戴尔笔记本电脑,惠普笔记本电脑和戴尔台式机。这三个都是Windows 10,所以我不能说操作系统不是一个因素。
当我将双2.03乘以100并将其存储在int
时,该值将存储为202而不是203。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
double s, t, u;
int a, b, c;
s = .99;
t = 2.03;
u = 5.00;
a = 100 * s;
b = 100 * t;
c = 100 * u;
printf("\n%.12f\t%.12f\t%.12f", s, t, u);
printf("\n%d\t%d\t%d", a, b, c);
return (EXIT_SUCCESS);
}
我的输出是:
0.990000000000 2.030000000000 5.000000000000
99 202 500
我相当肯定它与双打的存储有关,如果我显示到16位小数,我确实看到了差异,但我不相信出去这么多是合理的小数位。
使用这些常见数字是否有意义当我将double
强制转换为int
时,我会看到这种差异,如果是这样,建议使用的编码是什么?