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

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

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

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

  嗯,下面说正题。

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

  十进制小数转换为二进制小数的算法是*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位。

  

时间: 2024-10-24 23:57:21

为什么浮点型的计算不准确?的相关文章

【Java】Float计算不准确

大家可能都遇到过,float在计算某些值时,会有不准确的情况. 比如如下情况: 计算不准确 package com.nicchagil.study.java.demo.No10float计算.No01不准确的举例; public class Call { public static void main(String[] args) { System.out.println(0.08f + 0.01f); } } 打印: 0.089999996 用BigDecimal代替计算 如果需要准确计算fl

解决java float double 浮点型参与计算失精度

本人前段时间做一个社区电商应用,发现了一个 天坑   ...................让我哭会 . 下面听听我的踩坑之路吧 ,电商肯定跟¥打交道了,计算少不了的.由于本人太菜 单纯的以为  float  double 可以直接参与加减乘除 感觉这种代码万无一失没去想这么多直接 float*int . 之前简单测试没问题,项目上线后自己偶然才发现的(不知道公司测试干嘛的) ,当选择多件商品时 , 还是直接说现象吧 比如 在代码中    0.1 f  * A         A为int 型  

Java中浮点型数据Float和Double进行精确计算的问题

一.浮点计算中发生精度丢失  大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) / 0.1;System.out.println(a); 如果你认为这个程序的输出结果是“8”的话,那你就错了.实际上,程序的输出结果是“7.999999999999999”.好

关于浮点型计算遇到的小问题

最近考核任务里面用到了php计算和js计算 ,值得注意的是浮点型计算.float类型的数值是约等于.例如1.3  浮点类型的1.3=1.299999999循环,那么问题就来了. 浮点型在计算中主要会出现两种错误 1.修约计算 比如保留1位小数,0.003这样的比较小的数值会直接当成0来参与计算.所以计算的时候一定不要修约浮点型,包括计算的中间值也要尽可能保留足够精确的小数位. 2.判断 和上面类似.比如判断if(a>=0),如果结果进行了修约,a = 0.003,判断的结果是true而不是fal

深入浅出浮点型

惯例在取标题的时候取大了但又不想改┑( ̄Д  ̄)┍ 不知道是不是因为拍黄片太简单了,还是现在国内的培训机构太水了,又或是现在一群天天泡知乎的人自以为随便看看书就能当程序猿了,已经连续几天在PHP板块看到问为什么PHP的浮点型计算总是不准确,老实说这种基础的问题你在CSDN上,在QQ群里,再不济用会死人的百度一下都应该能知道.但偏偏没事跑囧乎上问,还特一本正经的问为啥解释器不优化一下... 好吧╮(╯-╰)╭ 那今天就稍微聊一下这个话题好了.其实两句话就能解释完,第一计算机计算的时候是使用二进制的

实时计算,流数据处理系统简介与简单分析

转自:http://www.csdn.net/article/2014-06-12/2820196-Storm 摘要:实时计算一般都是针对海量数据进行的,一般要求为秒级.实时计算主要分为两块:数据的实时入库.数据的实时计算.今天这篇文章详细介绍了实时计算,流数据处理系统简介与简单分析. 编者按:互联网领域的实时计算一般都是针对海量数据进行的,除了像非实时计算的需求(如计算结果准确)以外,实时计算最重要的一个需求是能够实时响应计算结果,一般要求为秒级.实时计算的今天,业界都没有一个准确的定义,什么

优化UITableViewCell高度计算的那些事

本文转载至 http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/ 我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持,github链接请戳我 这篇总结你可以读到: UIT

计算机程序的思维逻辑 - 小数计算为什么会出错?

违反直觉的事实 计算机之所以叫"计算"机就是因为发明它主要是用来计算的,"计算"当然是它的特长,在大家的印象中,计算一定是非常准确的.但实际上,即使在一些非常基本的小数运算中,计算的结果也是不精确的. 比如: float f = 0.1f*0.1f; System.out.println(f); 这个结果看上去,不言而喻,应该是0.01,但实际上,屏幕输出却是0.010000001,后面多了个1. 看上去这么简单的运算,计算机怎么会出错了呢? 简要答案 实际上,不是

js浮点数计算(加,减)

最近工作中经常遇到需要处理浮点型计算的问题,开始一直都在用把浮点数先乘以10的对应小数的位数的次方化成整数再去开始计算. 例如100.01+100.02,可以化成(100.01*100+100.02*100)/100来做计算,但是最近发一个浮点数乘以一个10的次方也会有精度问题发生,突然感觉前面的工作是不是有好多地方埋了很多坑啊,不能愉快的工作啦. 正好周未没什么别的计划,想研究下怎么处理JS的浮点型计算的精度问题 既然浮点数的计算精度有问题,那何不就在计算过程中绕过浮点型的计算了,于是有如下思