int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
输出:
340.000000 // 没关系。
但是如果写x=3.1234e2
输出是312.339996
,如果x=3.12345678e2
输出是312.345673
。
为什么输出是这样的?我想如果我写x=3.1234e2
输出应该是312.340000
,但实际输出是312.339996
使用 GCC 编译器。
int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
输出:
340.000000 // 没关系。
但是如果写x=3.1234e2
输出是312.339996
,如果x=3.12345678e2
输出是312.345673
。
为什么输出是这样的?我想如果我写x=3.1234e2
输出应该是312.340000
,但实际输出是312.339996
使用 GCC 编译器。
并非所有小数都具有精确的二进制等价物,因此它会四舍五入到最接近的值。
简化的例子,
如果分数有 3 位,则可以:
0
0.125
0.25
0.375
...
0.5 具有精确表示,但 0.1 将显示为 0.125。
当然,真正的差异要小得多。
为了提高效率,浮点数通常表示为二进制分数乘以 2 的幂。这与以 10 为底的表示法一样准确,只是有些小数部分不能精确地表示为二进制小数。相反,它们被表示为近似值。
此外,afloat
通常是 32 位长,这意味着它没有那么多有效数字。您可以在示例中看到它们精确到大约 8 位有效数字。
但是,您打印的数字稍微超出了它们的重要性,因此您会看到差异。查看您的printf
格式字符串文档以了解如何打印更少的数字。
您可能需要准确地表示十进制数;这经常发生在金融应用程序中。在这种情况下,您需要使用一个特殊的库来表示数字,或者简单地将所有内容计算为整数(例如将金额表示为美分而不是美元和美元的小数部分)。
标准参考是What Every Computer Scientist Should Know About Floating-Point Arithmetic,但看起来这对您来说非常先进。或者,如果您想了解详细信息,您可以使用 Google 浮点格式(尤其是 IEEE 标准格式)或在 Wikipedia 上查找它们。