zoukankan      html  css  js  c++  java
  • java float 加减精度问题

    java float 加减精度问题
    在取这个字段的时候转换成BigDecimal就可以了
    同时,BigDecimal是可以设置精度的。
    float m = 12.22F;
    float c = 1.22F;
    BigDecimal b1 = new BigDecimal(Float.toString(m));
    BigDecimal b2 = new BigDecimal(Float.toString(c));
    System.out.println(m);
    System.out.println(c);
    Float add = b1.add(b2).floatValue();
    System.out.println("add=========" + add);
    Float less = b1.subtract(b2).floatValue();
    System.out.println("less=========" + less);
    Float multiply = b1.multiply(b2).floatValue();
    System.out.println("multiply=========" + multiply);
    //给divide设置精确的小数点,解决不整除报异常
    Float divide = b1.divide(b2,4, BigDecimal.ROUND_HALF_EVEN).floatValue();
    System.out.println("divide=========" + divide);
    ===========================================
    BigDecimal不整除的一个异常java.lang.ArithmeticException: Non-terminating decimal expansion
    金额的数据类型是BigDecimal 
    通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException:
     Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)
    应用场景:一批中供客户的单价是1000元/年,如果按月计算的话1000/12=83.3333333333.... 
    解决之道:就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) 
    在 java中, 四舍五入通过 BigDecimal 来实现。一定要注意:BigDecimal is Immutable。
    也就是跟String一样,对前一个的修改,比如setScale(), add()等都会返回一个新的BigDecimal.
    四舍五入舍入模式是 BigDecimal.ROUND_HALF_UP 
    BigDecimal定义了一下舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,
    下面简单介绍,详细请查阅J2se API文档
    static int
    ROUND_CEILING
    Rounding mode to round towards positive infinity.
    向正无穷方向舍入
    static int
    ROUND_DOWN
    Rounding mode to round towards zero.
    向零方向舍入
    static int
    ROUND_FLOOR
    Rounding mode to round towards negative infinity.
    向负无穷方向舍入
    static int
    ROUND_HALF_DOWN
    Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,
    in which case round down.
    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入,例如1.55保留一位
    小数结果为1.5
    static int
    ROUND_HALF_EVEN
    Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant,
    in which case, round towards the even neighbor.
    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,
    使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
    static int
    ROUND_HALF_UP
    Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,
    in which case round up.
    向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位
    小数结果为1.6
    static int
    ROUND_UNNECESSARY
    Rounding mode to assert that the requested operation has an exact result, hence no
    rounding is necessary.
    计算结果是精确的,不需要舍入模式
    static int
    ROUND_UP
    Rounding mode to round away from zero.
    向远离0的方向舍入
    ===========================================
    如何应用Java的BigDecimal类
    双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。
    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。表5.7中列出了BigDecimal类的主要构造器和方法。
    表5.7 BigDecimal类的主要构造器和方法
    构造器  描 述
    BigDecimal(int)创建一个具有参数所指定整数值的对象。
    BigDecimal(double)创建一个具有参数所指定双精度值的对象。
    BigDecimal(long)创建一个具有参数所指定长整数值的对象。
    BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。
    续表
    方 法描 述
    add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。
    subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。
    multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。
    divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。
    toString()将BigDecimal对象的数值转换成字符串。
    doubleValue()将BigDecimal对象中的值以双精度数返回。
    floatValue()将BigDecimal对象中的值以单精度数返回。
    longValue()将BigDecimal对象中的值以长整数返回。
    intValue()将BigDecimal对象中的值以整数返回。
    注意,由于一般数值类型,例如double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
    构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。关于构造器概念和编写技术,将在本书第6章详细介绍。
    大自然,飘然的风,QQ群: python技术交流群:453879716,人工智能深度学习群:251088643
    golang技术交流群:316397059,vuejs技术交流群:458915921 渗透技术:534096581,囤币一族:621258209,有兴趣的可以加入
    微信公众号:大自然预测(ssqyuce)原双色球预测, 心禅道(xinchandao)
  • 相关阅读:
    【Educational Codeforces Round 101 (Rated for Div. 2) C】Building a Fence
    【Codeforces Round #698 (Div. 2) C】Nezzar and Symmetric Array
    【Codeforces Round #696 (Div. 2) D】Cleaning
    【Codeforces Round #696 (Div. 2) C】Array Destruction
    【Educational Codeforces Round 102 D】Program
    【Educational Codeforces Round 102 C】No More Inversions
    【Good Bye 2020 G】Song of the Sirens
    【Good Bye 2020 F】Euclid's nightmare
    使用mobx入门
    requestAnimationFrame 控制速度模拟setinterval
  • 原文地址:https://www.cnblogs.com/zdz8207/p/2510995.html
Copyright © 2011-2022 走看看