为什么浮点型的计算不准确?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么浮点型的计算不准确?相关的知识,希望对你有一定的参考价值。

  要想自己写点技术博客也真是尴尬呢。野路子出身,对所有东西都是只知道皮毛。

  简单回顾下自己吧,毕业于磨子桥技术学院种猪选育专业,读大学的时候为了做游戏进入了软件行业。尽管做出来的项目耦合的辣眼睛,崩溃性失败,还是希望好好在这个行业里经营下去。

  最近报了个机构,从头开始系统的提升自己的技术能力,以期早日达到专业水平。在学习过程中遇到一些引起自己思考的点,大概都是些很蠢的问题。记录到博客里,算是总结自己的技术能力重构经历吧。

  嗯,下面说正题。

  培训班刚开不久,还在学习一些基础的编程思想方面的东西。讲到数据类型的时候说到浮点型算不准。我的印象里当时做游戏的时候就遇到这个问题,不过那时候只管拿来用了也没思考过背后的原理。这次特地好好查了下为什么浮点型算不准:

  十进制小数转换为二进制小数的算法是*2取整知道没有小数了为止,但不论如何计算*2是永远不能消灭小数部分的,计算将无线进行下去。局限于浮点型变量的长度,所以精度自然会丢失。

  

  下面转一段前辈对float存储格式的总结(Java):

  

  将一个float型转化为内存存储格式的步骤为:

     (1)先将这个实数的绝对值化为二进制格式, 
     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 
     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 
     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 
     (5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 
     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

  

以上是关于为什么浮点型的计算不准确?的主要内容,如果未能解决你的问题,请参考以下文章

什么叫单精度浮点型?什么叫双精度浮点型?

T-SQL如何将整型值变成浮点型

深入浅出浮点型

关于浮点型的运算---比较

什么是浮点(float)数据类型?

vue如何判断浮点类型数是不是相等