与浮点数混淆

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表示一样准确,除了有小数部分不能精确表示为二进制分数。 相反,它们表示为近似值。

而且, float通常是32位长,这意味着它没有那么多有效数字。 您可以在示例中看到它们准确到大约8位有效数字。

但是,您打印的数字略超出其重要性,因此您会看到差异。 查看printf格式的字符串文档,了解如何打印更少的数字。

您可能需要准确表示十进制数字; 这通常发生在金融应用程序中。 在这种情况下,您需要使用特殊库来表示数字,或者只是将所有内容计算为整数(例如将金额表示为美分而不是美元和一美元的分数)。

标准参考是每个计算机科学家应该知道的关于浮点算术的内容 ,但看起来这对你来说非常先进。 或者,您可以使用谷歌浮点格式(特别是IEEE标准格式)或在维基百科上查找它们,如果您想要详细信息。