• Java-杂项:Float 加减精度问题


    ylbtech-Java-杂项:Float 加减精度问题
    1.返回顶部
    1、

    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章详细介绍。

    2、
    2.返回顶部
     
    3.返回顶部
     
    4.返回顶部
     
    5.返回顶部
     
     
    6.返回顶部
     
    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    基贝叶斯后验概率的拼写检查器实现 python
    Hadoop The Definitive Guide 2nd Edition 笔记
    DGV删除当前选中行
    DGV设置单元不可编辑
    DGV获取当前选中单元格
    HDU2112_HDU Today_有地名的最短路_map+SPFA
    HDU1026_优先队列+广搜+打印路径
    HDU2757_Ocean Currents_优先队列+广搜_入门题_十四周模拟赛
    自己写的SPFA模板(可打印路径)
    HDU2782_暴力深搜_第十四周模拟赛
  • 原文地址:https://www.cnblogs.com/storebook/p/10442534.html
Copyright © 2020-2023  润新知