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精度为什么会丢失?浅谈java的浮点数精度问题

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

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

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

关于java中Double类型的运算精度问题

标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi...
  • pttaag
  • pttaag
  • 2010年09月28日 16:02
  • 58837

Java精度问题

一、 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值。 java中各类型的精度范...

java中关于数据精度问题

java中特别在银行内使用数据时,对数据的精度要求比较高,这个时候通常使用Bigdecimal类来提高数据的精度,但是由于在代码开发过程中会遇到一些开发人员将该数据进行double或者long的转换,...

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

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

Java中的数字基本运算和精度问题

一. 精度   举例:double result = 1.0 - 0.9; 这个结果不用说了吧,都知道了,0.09999999999999998 float和double类型主...

Java的类型以及在高精度数字运算过程中保持精度

1.    类型杂论1.1.    关于引用    Java 语言首先便假定了我们只希望进行面向对象的程序设计,也就是说用它正式写程序之前首先必须先将自己的思想转入一个纯净的面向对象的世界,Java ...
  • akglk
  • akglk
  • 2006年06月25日 15:43
  • 4469

关于java基本类型计算时的类型转换

java的基本类型在编程时常常面临不同类型变量之间的相加,如:int+char、float+int、int+byte、int+double。 所以为了不同类型的变量能够进行计算,计算时会进行相应的类型...

Java数据类型的转换:隐式(自动)转换与强制转换

原文链接:http://java.chinaitlab.com/base/725590.html 一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,doubl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 各数据类型计算的精度问题
举报原因:
原因补充:

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