为什么这个浮点数的值会改变它的设置?

为什么这个C程序输出“错误”?

#include void main() { float f = 12345.054321; printf("%f", f); getch(); } 

输出:

 12345.054688 

但输出应为12345.054321

我在VS2008中使用VC ++。

它给出了“错误的”答案,因为并非所有真实值都可以通过浮点数表示(或者双重数据)。 你会得到的是基于底层编码的近似值。

为了表示每个实际值,即使在1.0×10 -100和1.1×10 -100之间 (真正的微小范围),您仍然需要无限数量的位。

单精度IEEE754值只有32位可用(其中一些是其他任务,如指数和NaN / Inf表示),因此无法为您提供无限精度。 它们实际上有23位可用,精度约为2 24 (有一个额外的隐含位)或仅超过7位十进制数(log 10 (2 24 )大约为7.2)。

我在引号中加上“错误”这个词,因为它实际上并没有错。 你对计算机如何代表数字的理解有什么不妥(尽管你不会被冒犯,但你并不孤单。)

转到http://www.h-schmidt.net/FloatApplet/IEEE754.html并在“十进制表示”框中键入您的号码以查看此操作。

如果你想要一个更准确的数字,使用双精度而不是浮点数 – 它们有两倍的可用于表示值的位数(假设你的C实现分别使用了IEEE754单精度和双精度数据类型的float和double)。

如果你想要任意精度,你需要使用像GMP这样的“bignum”库,尽管它比原生类型慢一些,所以要确保你理解权衡。

十进制数12345.054321无法准确表示为平台上的float 。 您看到的结果是可以表示为float的最接近数字的十进制近似值。

float s是关于方便和速度的,并使用二进制表示 – 如果你关心精度使用十进制类型。

要了解这个问题,请阅读每个计算机科学家应该知道的关于浮点运算的内容 : http : //docs.sun.com/source/806-3568/ncg_goldberg.html

有关解决方案,请参阅十进制算术常见问题解答 : http : //speleotrove.com/decimal/decifaq.html

单精度浮点值只能表示大约八到九个有效(十进制)数字。 除此之外,您还会看到量化错误。

这与精确度有关。 您的号码无法准确存储在浮点数中。