`
greemranqq
  • 浏览: 965230 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java中float/double浮点数的计算失去精度问题

阅读更多
 现在我们的程序中,时常会用到金额以及其他数据的计算,但往往计算结果和我们预计的会出现差异。比如:		
double a = 0.7;
double b = 0.11;
System.out.println(a+b);
预计的结果是:0.81
实际的过结果是:0.8099999999999999
至于原因,大学老师提到过一些,但是从感觉模糊,这里我就网上找了一篇简单阐述一下:
原文链接:http://hxraid.javaeye.com/blog/504293

为什么浮点数会丢失精度?   十进制数的二进制表示可能不够精确

浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,8.1的二进制表示并非就是精确的8.1。反而最为接近的二进制表示是 0.8099999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。   类型失配 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。 注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。  如何进行浮点数精度计算?                    Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。

分享到:
评论

相关推荐

    Java中double类型下出现精度计算错误情况下出力方法

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...

    Java-关于基本数据类型中浮点数计算产生的精度问题

    在基本数据类型中,float和double都表示浮点型数据,而计算机计算采取的是对二进制的计算,所以会存在一定程度上的精度丢失问题。 BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,...

    浮点数的数据结构.pdf

    在JAVA中,通常使⽤的浮点数的类型为 FLoat和Double,他们的区别在于⼤⼩与储存⽅式不同 public class App { public static void main(String[] args) { System.out.println("Float:"+Float.SIZE); System.out....

    Java中的浮点数分析

     浮点数分为单精度和双精度,Java中的单精度和双精度分别为float和double.你们知道float和double是怎么存储的吗? float占4个字节,double占8个字节,为了方便起见,这里就只讨论float类型. float其实和一个int型的...

    Java与MySQL中小数保存问题解析.pptx.pptx

    在Java和MySQL中,小数的精度可能会受到限制,如float类型的小数只能精确到6-7位,double类型也只能精确到15-16位。 浮点数运算问题 在进行浮点数运算时,可能会出现精度丢失的问题,例如0.1+0.2的结果并不等于0.3...

    单双精度转十六进制.zip

    单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具

    详谈javascript精度问题与调整

    在JS中数值类型就只有number类型,没有int,float,double之分,number类型实际上存储的就是IEEE754标准的浮点数,计算规则也是。 在表达式计算前,先要按照标准将两个数转成浮点数。 IEEE 754规定: 1.32位的浮点数...

    Java Number & Math 类.pdf

    Java Number类是Java中的一个抽象类,它是所有数值类型的超类,包括整数、浮点数和大数。它提供了一组用于操作数值类型的方法,如转换、比较、算术运算等。 二、Java Number类提供了哪些基本的数字操作? Java ...

    java计算器程序.doc

    //需要解决的问题,数学的运算都有正负号的出现,在点击等号的时候就会有冲突,应该怎样解决,经验:双精度浮点型数据类型是会像后减一位。0.7会显示成0.69999999 public class app74 { static int i=0; static ...

    Java八大基本类型详解

    Java有八大基本类型,其中包括4个整数类型,2个浮点类型,有个字符类型,1个布尔类型 八大基本类型及其包装类 ...float是单精度浮点数,double是双精度浮点数;double类型要比float类型的精度更高。 举个栗子:分别向

    Java的8大基本数据类型.pdf

    Java的 的8⼤基本数据类型 ⼤基本数据类型 Java8⼤基本数据类型 ⼤基本数据类型 byte(字节型)、short(短整型)、int (整型) 、long(长整型) float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、...

    数字类型 转换 字节数组

    可以将 Float、 Double、 与byte[]之间进行互换,从而可以在Java 的开发环境中实现C语言的Union 的功能! /** * 对数字和字节进行转换。 * 基础知识: * 假设数据存储是以大端模式存储的: * byte:...

    Java 基本知识之基本数据类型

    Java 基本数据类型   Java的基本类型有8种。 按大类分,Java 有两大数据类型:内置数据类型、引用...float 数据类型是单精度、32位、符合IEEE 754标准的浮点数; 默认值是0.0f; double 数据类型是双精度、64 位、符合

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    大数据:hive2

    hive的基本类型 Hive数据类型 Java数据类型 长度 例子 TINYINT byte 1byte有符号整数 20 SMALINT short 2byte有符号整数 ...FLOAT ...float ...单精度浮点数 3.14159 DOUBLE double

Global site tag (gtag.js) - Google Analytics