zoukankan      html  css  js  c++  java
  • BigDecimal精度问题

    介绍

      1.商业计算使用BigDecimal。
      2.使用参数为String的构造函数。
      3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象。所以在做加减乘除后千万要保存操作后的值。

    案例

      代码1:

    public class Test001 {
    	public static void main(String args[]) {
    		BigDecimal a = new BigDecimal(1.5);
    		BigDecimal a1 = new BigDecimal(329.530);
    		System.out.println(a.multiply(a1).setScale(2, BigDecimal.ROUND_HALF_UP));
    	}
    }
    

      输出:

    494.29
    

      代码2:

    public class Test001 {
    	public static void main(String args[]) {
    		BigDecimal a = new BigDecimal("1.5");
    	  BigDecimal a1 = new BigDecimal("329.530");
    		System.out.println(a.multiply(a1).setScale(2, BigDecimal.ROUND_HALF_UP));
    	}
    }
    

      输出:

    494.30
    

    计算器输出结果:

    489.30
    

      原因解析:
      JDK的描述:参数为dubbo的构造方法的结果具有一定的不可预知性,认为java在写入new BigDecimal(0.1)中这个0.1不是标准的0.1可能是一个无限趋近于0.1的一个小数,虽然表面上等于他。

    源码

        public BigDecimal multiply(BigDecimal multiplicand) {
            int productScale = checkScale((long) scale + multiplicand.scale);
            if (this.intCompact != INFLATED) {
                if ((multiplicand.intCompact != INFLATED)) {
                    return multiply(this.intCompact, multiplicand.intCompact, productScale);
                } else {
                    return multiply(this.intCompact, multiplicand.intVal, productScale);
                }
            } else {
                if ((multiplicand.intCompact != INFLATED)) {
                    return multiply(multiplicand.intCompact, this.intVal, productScale);
                } else {
                    return multiply(this.intVal, multiplicand.intVal, productScale);
                }
            }
        }
    

      在这个地方就是判断是不是字符串的,这个this.intCompact 是获取到参数的整数值,如果获取到时一大串数字,那就是dubbo参数传进来的,这里进行判断,从而获取到不同的值。进入到不同的方法进行运算。其实运算原理大致说下,小数转换为整数计算,最后除以10的n次方即可。

  • 相关阅读:
    struts2(五) s标签和国际化
    struts2(四) ognl表达式、值栈、actionContext之间的关系
    数据结构(一) 单链表的实现-JAVA
    struts2(三) 输入校验和拦截器
    struts2(二) 表单参数自动封装和参数类型自动转换
    struts2(一) struts2入门
    Java Web(十四) 编写MyBookStore项目的总结
    Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
    Java中反射机制详解
    Java Web(十二) commons-fileupload上传下载
  • 原文地址:https://www.cnblogs.com/donghang/p/9233656.html
Copyright © 2011-2022 走看看