Java 各数据类型计算的精度问题

原创 2016年11月08日 16:51:47

开发了一个项目,涉及到了价格计算的问题,由于之前考虑的不够周全,所有遇到了好多的类型之间计算出现的精度不准的问题,在这和大家分享一下,说的有不对的直接关闭此网页.

  //直接用int + double 进行运算,可想而知结局是悲惨的
        int g = 2;
        double a = 0.01;
        double b = 0.05;
        double k = g+b+a;
        System.out.println("k:" + k);
        结果:k:2.0599999999999996

 ***这个因为如果不同类型的数据进行相加,会将类型统一成一个类型的数据在进行计算,因为double类型的数据占的字节多  所以java编译器会自己帮你把int类型的数据转换成double 类型的数据 然后再实行两个double类型的数据相加*** 

  //当时用float,然后就出现了小数丢失的现像
        float d = 0.01f;
        float e = 0.05f;
        float f = d + e;
        System.out.println("f:" + f);

        结果:f:0.060000002
  //接着换下一个double,当时觉得肯定是可以了,但是........
        double a = 0.01;
        double b = 0.05;
        double c = a + b;
        System.out.println("c:" + c);   
        结果:c:0.060000000000000005

***并不是所有的小数都可以用二进制浮点数来精确表示的
二进制浮点不可能将0.1——或者10的其它任何次负幂——精确表示为一个长度有限的二进制小数 (看下计算机组成原理中的浮点数的表示方法,好象有不同的标准)***

解决的方法可以用BigDecimal类,该类位于java.math包中

基本 加,减,乘,除,保留两位小数,四舍五入等

BigDecimal decimal = new BigDecimal(要计算的参数);
值得注意的是要是想计算的精准一些 ,f要计算的参数最好是字符类型的

类型转换的时候最好用各数据类型包装器,例如:Integer.parseInt(s)等, 像 (int)a 强行转换类型有的时候会有问题

    // 相加
    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    // 相减
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    // 相乘
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }


     /**    
      *   相除,做除法的时候相对的麻烦一点,涉及的多一些
      *   提供精确的小数位四舍五入处理。    
      *   @param   v1   需要四舍五入的数字
      *   @param   v2   需要四舍五入的数字        
      *   @param   scale   小数点后保留几位    
      *   @return   四舍五入后的结果    
      */     
    public static double round(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("此参数错误");
        }
        BigDecimal one = new BigDecimal(Double.toString(v1));
        BigDecimal two = new BigDecimal(Double.toString(v2));
        return one.divide(two, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    } 

以上就是本次开发中遇到的BUG, 菜鸟一个努力学习中 , 多多支持….

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA基本数据类型范围和float、double精度问题

1.八中数据类型的分类如下:  第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 boolean(它只有两个值可取true false) ...
  • zc_ad
  • zc_ad
  • 2016年11月30日 09:56
  • 1792

Java中如何解决double和float精度不准的问题

我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性。 在进行数字运算时,如果有double或float类型的浮点数参与计算,...
  • yinan9
  • yinan9
  • 2013年12月12日 15:37
  • 35044

java float double精度为什么会丢失?浅谈java的浮点数精度问题

由于对float或double的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:public class FloatDoubleTest {public static void ...
  • abing37
  • abing37
  • 2010年02月27日 21:46
  • 33070

java 处理高精度计算

java 处理高精度计算 Double.valueOf(String) and Float.valueOf(String)都会丢失精度。 为了解决这个问题,需要用到BigDecimal类。...
  • luhuajcdd
  • luhuajcdd
  • 2013年06月08日 15:20
  • 14073

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我...
  • jdsjlzx
  • jdsjlzx
  • 2015年08月25日 16:12
  • 13635

Java浮点数float和double精确计算的精度误差问题总结

1、float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。 原因:超出float精度范围,无法精确计算。 float和double的精...
  • aya19880214
  • aya19880214
  • 2015年05月21日 14:34
  • 25497

java数值范围以及float与double精度丢失问题

1.java中int,float,long,double取值范围 public class TestOutOfBound { public static void main(String[] args...
  • tomcat_2014
  • tomcat_2014
  • 2016年05月19日 15:15
  • 5536

JAVA基本数据类型范围和float、double精度问题

1.八中数据类型的分类如下:  第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 boolean(它只有两个值可取true false) ...
  • zc_ad
  • zc_ad
  • 2016年11月30日 09:56
  • 1792

大数与数论(大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法表示的数值。 )

  • 2008年12月08日 10:56
  • 316KB
  • 下载

java----基本数据类型精度的研究与使用(char,byte,int等)

java----基本数据类型精度的研究与使用 1.java基本数据类型精度表     byte--short--int--long--float--double     1      2      ...
  • bestxianfeng163
  • bestxianfeng163
  • 2017年08月05日 22:34
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 各数据类型计算的精度问题
举报原因:
原因补充:

(最多只允许输入30个字)