浮点值的小数计算为什么不准?

都是浮点数为什么2.0f-1.1f是对的。得0.9而2.0-1.1确实不准得到.89999999
我想知道的是为什么不准?
再就是浮点小数即然不准,那大家都在什么情况下用过浮点型。
[b]问题补充:[/b]
请注意
同时都是浮点型,为什么float相减是对的,double相减有误差。
[b]问题补充:[/b]
好吧,同志们,我再完善一下这个问题。

同时都是浮点型,为什么float相减2.0f-1.1f是0.9,double相减2.0-1.1是0.89999

他们在处理小数上有何区别

[quote]
同时都是浮点型,为什么float相减2.0f-1.1f是0.9,double相减2.0-1.1是0.89999
[/quote]

因为现在的CPU都是算double的。

float运算会被转化为double运算,结果四舍五入成float的精度。
结果0.8999999999...就变成了0.9。

double相减后面还有n个9,但是被简单截断隐藏了,它不会四舍五入。
如果你格式化输出数字,你可以看到大约还有15或者16个9。

因为计算机算术是二进制的。

十进制的0.1变成二进制是无限循环小数,肯定得截断。

对10进制货币的加减,可以用BigDecimal类型(有的语言叫Decimal)避免截断误差。

也可以自己定义一个数字类,像matlab做的那样。

错误和误差是两回事,最末尾的那点区别,大部分情况都没关系吧。

举个例子:用双精度浮点数计算地球周长,截断误差在0.000001毫米数量级,有关系么?

NASA都不在乎,你就别在乎了。

楼主, 你没有搞清楚, 错误/误差的关系。
错误是不能容忍的
误差是能够容忍的
如果你有兴趣去找找ieee关于浮点数的定义, 以及误差的描述。 非常有趣的。
浮点数的关键是精度的定义, 在小数据范围呢, float/double 的精度还是保持一致的, 具体能精确多少, 你可以查询下float/double的定义。

说白了, 任何浮点运算都需要定义一个应用能接受的精度。 在这个精度下, 我们认为是正确的。 比如我们要求, 0.0001 的精度, 那么1.000001 跟 0.99999999 的结果是相等的, 计算结果上都表示成 1.0000 。 不知道这么说, 你明白没有。 因为精度是针对业务而言的。 比如地球到月亮的距离, 即使在航天技术上, 我想精确到纳米是没有什么意义的吧? 但是,测量细胞的大小, 你不能使用厘米(0.01米)作为精度吧。 就是这么个道理。

另外, 你如果算钱的话, 建议使用分作为计算结果。 把所有的转成整数分进行计算。可以保证财务统计对“正确“的要求。

我不都跟你说了, 0.9 跟 0.89999999999 本质上是一样的。 你看看double/float在内存里的表示机制吧。