首页 > 代码库 > 为什么浮点型的计算不准确?
为什么浮点型的计算不准确?
要想自己写点技术博客也真是尴尬呢。野路子出身,对所有东西都是只知道皮毛。
简单回顾下自己吧,毕业于磨子桥技术学院种猪选育专业,读大学的时候为了做游戏进入了软件行业。尽管做出来的项目耦合的辣眼睛,崩溃性失败,还是希望好好在这个行业里经营下去。
最近报了个机构,从头开始系统的提升自己的技术能力,以期早日达到专业水平。在学习过程中遇到一些引起自己思考的点,大概都是些很蠢的问题。记录到博客里,算是总结自己的技术能力重构经历吧。
嗯,下面说正题。
培训班刚开不久,还在学习一些基础的编程思想方面的东西。讲到数据类型的时候说到浮点型算不准。我的印象里当时做游戏的时候就遇到这个问题,不过那时候只管拿来用了也没思考过背后的原理。这次特地好好查了下为什么浮点型算不准:
十进制小数转换为二进制小数的算法是*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位。
为什么浮点型的计算不准确?