• 计算价格, java中浮点数精度丢失的解决方案


    项目交付测试, 发现多个商品,在计算价格的时候会忽高忽低??? 奇怪,看了逻辑没有毛病, debug吧, 发现在使用double计算时,精度丢失了

    解决方法:涉及到小数的情况 使用BigDecimal 来保证精度

    相关原理,参考这篇文章 : https://blog.csdn.net/S031302306/article/details/81563891

     java.math.BigDecimal用法:

    (1)把计算结果转为BigDecimal类型的

    1
    Double dd= new BigDecimal(cc).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

    setScale(2, BigDecimal.ROUND_HALF_UP) 保留2位小数,
    BigDecimal.ROUND_HALF_UP(4) 表示四舍五入
    BigDecimal.ROUND_HALF_DOWN(5) 表示五舍六入

    (2)BigDecimal 自带的方法来加减

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public BigDecimal add(BigDecimal value);//加法
    public BigDecimal subtract(BigDecimal value);//减法
    public BigDecimal multiply(BigDecimal value);//乘法
    public BigDecimal divide(BigDecimal value);//除法
     
     
    BigDecimal aaa = new BigDecimal(Double.toString(aa));
    BigDecimal bbb = new BigDecimal(Double.toString(bb));
    BigDecimal ccc = bbb.subtract(aaa);
    Double cc = ccc.doubleValue();

     

    2、创建BigDecimal对象

    BigDecimal aaa = new BigDecimal(11.01);精度会缺失,数值不准确
    BigDecimal bbb = new BigDecimal("11.02");准确
    BigDecimal ccc = BigDecimal.valueOf(11.03);准确

    最好使用字符串来创建,不要直接用double值创建

    3、BigDecimal.ZERO 提供了默认值可以直接用

    如上代码

    1
    BigDecimal zero = BigDecimal.ZERO;<br><br>

    4、BigDecimal 提供的加减乘除

    public BigDecimal add(BigDecimal value);//加法
    public BigDecimal subtract(BigDecimal value);//减法
    public BigDecimal multiply(BigDecimal value);//乘法
    public BigDecimal divide(BigDecimal value);//除法

    BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象
    因此加减乘除、都需要自己再接收这个值

    1
    2
    bbb.add(ccc);bbb=:11.02
    bbb=bbb.add(ccc);bbb=:22.05

      

    public BigDecimal add(BigDecimal value);

    1
    2
    3
    4
    5
    public static double add(double value1,double value2){
      BigDecimal b1 = new BigDecimal(Double.toString(value1));
      BigDecimal b2 = new BigDecimal(Double.toString(value2));
      return b1.add(b2).doubleValue();
    }

      

    5、compareTo

    BigDecimal的比较用的是BigDecimal的compareTo方法,将此 BigDecimal 与指定的 BigDecimal 比较。
    根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,2.0 和 2.00)被认为是相等的。
    当此 BigDecimal 在数字上小于、等于或大于被比较对象时,返回 -1、0 或 1。

    1
    2
    3
    4
    5
    6
    BigDecimal one = BigDecimal.valueOf(1);
    BigDecimal two = BigDecimal.valueOf(2);
    BigDecimal three = one.add(two);
    int i1 = one.compareTo(two);//-1
    int i2 = two.compareTo(two);//0
    int i3 = three.compareTo(two);//1
  • 相关阅读:
    125-PHP类__set()魔术方法
    124-PHP类析构函数
    123-PHP类构造函数
    122-PHP类成员函数(三)
    121-PHP类成员函数(二)
    120-PHP调用成员方法并将不同类的对象做为参数
    119-PHP调用private成员的方法
    118-PHP调用带参数的成员方法
    117-PHP在外部无法调用private类成员函数
    HDU-2045 不容易系列之(3)—— LELE的RPG难题 找规律&递推
  • 原文地址:https://www.cnblogs.com/gloryhope/p/9896719.html
Copyright © 2020-2023  润新知