2011-11-11 33 views
1

我刚刚发现了一些奇怪的在我的代码印刷浮点值安慰精密problem_

我创建简单的应用程序,以显示你有什么我谈论

float Test1 = 112.12; 
float Test2 = 0.12; 

printf("Test1 %15f", Test1); 
printf("Test1 %15f", Test1); 

我一直认为,如果我写的Test1 = 112.12这意味着它等于112.120000000

但是我得到112.120003

并在第二个例子中,我得到0.11999或0.120000这取决于

有人能解释我为什么会出现这种情况会发生什么,如果我尝试这两个数字将他们得到转换为double(或任何其他更精确的数据类型)划分,所以我可以得到更高的精度,否则会在使用它们的当前形式(浮点)

我已经使用VS 2010中测试该(如果它的事项)

回答

2

两个意见:

  1. 计算机使用基体2,而不是基座10
  2. 浮点numbe rs不准确

由于第一点,有一些数字不能很好地从我们的系统转换到计算机系统。 0.3不能100%精确地代表直接二进制(这并不是说计算机无法精确表示它,只是它们不能用于常用系统)。

因为第二点,它总是危险的使用浮点数的精确值。我会推荐阅读关于浮点数的维基百科文章 - 它提到了准确性问题。

+0

是的,我同意但不是更合乎逻辑它将数字“降低”到更低的值,如0.119999不是更高的值,然后我像第一个示例那样输入 – user996937

+0

@ user996937 - 没有“舍入”我只是给它一个它不能完全表示的数字,而这是它能够提供的最好的数字。 –

0

这与方法电脑专卖店号码做。检查这两个维基百科文章

不要使用float除非你真的不得不这样做。改为使用double

+1

没有必要虔诚地避免漂浮物。事实上,我听到人们说完全相反。使用最适合你和你的要求的东西。 –

+0

@MattFenwick他们有理由吗?在正常的,不太古老的消费级硬件上,当你有选择的时候,选择我所知道的唯一原因是空间,如果你有它们的_lot_。 –