为什么浮点数会丢失精度?



主要软件:
主要软件版本: N/A
主要软件修正版本: N/A
次要软件: N/A

问题: 我在编程环境中使用浮点数或双精度浮点数的时候发觉数字的值会有微小的变化。比如输入2.4的时候显示的是2.3999999999999999。为什么浮点数会出现这种不准确的情况呢?


解答: 造成浮点数不精确的主要原因有两个:

  1. 十进制数的二进制表示可能不够精确


  2. 浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。如果您想得到这个公式或是尾数的更多资料,可以参考下面链接的“What is Mantissa?”文章。

    您所遇到的精度损失会在任何操作系统和编程环境中遇到。

    注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。如果您想要知道BCD的更多消息您可以参考下面链接的文章“What is Binary Coded Decimal (BCD)?”

    想要了解这种精度损失的更多信息您可以参考IEEE/ANSI Standard 754-1985,这篇文章包括Standard for Binary Floating Point Arithmetic


  3. 类型失配


  4. 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。

    注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。



相关链接: KnowledgeBase 2PEEHE2Q: What is Mantissa?

KnowledgeBase 2T8C70Q8: What is Binary Coded Decimal (BCD)?

附件:





报告日期: 05/30/2006
最近更新: 06/29/2006
文档编号: 2T7G1PQ8