开发者

Java使用BigDecimal公式精确计算及精度丢失问题

目录
  • 一、Java使用BigDecimal公式计算(精确计算)
    • 公式加法计算~add
    • 公式减法计算~subtract
    • 公式乘法计算~multiply
    • 公式除法计算~divide
  • 二、 BigDecimal(舍入模式)选择
    • 三、 BigDecimal.setScale用法案例
      • 四、Java使用BigDecimal精度丢失问题
        • 总结

          一、Java使用BigDecimal公式计算(精确计算)

          介绍:

                 使用BigDecimal加减乘除方法运算,可以使用BigDecimal类提供的add、subtract、multiply、divide方法函数实现。

          公式加法计算~add

            public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
           
                 BigDecimal b = BigDecimal.valueOf(2.1);
           
                 //BigDecimal计算add
                 BigDecimal addResult = a.add(b);
                 System.out.println("结果集: " +addResult);
             }

          结果集: 

          Java使用BigDecimal公式精确计算及精度丢失问题

          公式减法计算~subtract

          public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
           
                 BigDecimal b = BigDecimal.valueOf(2.1);
           
                 BigDecimal计算subtract
                 BigDecimal subtract = a.subtract(b);
           
                 System.out.println("结果集subtract: " +subtract);
             }

          结果集:

          Java使用BigDecimal公式精确计算及精度丢失问题

          公式乘法计算~multiply

          public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
                 BigDecimal b = BigDecimal.valueOf(2.1);
                 BigDecimal计算multiply
                 BigDecimal multiply = a.multiply(b);
                 System.out.println("结果集: " +multiply);
             }

          结果集:

          Java使用BigDecimal公式精确计算及精度丢失问题

          公式除法计算~divide

          public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
                 BigDecimal b = BigDecimal.valueOf(2.1);
                 //BigDecimal计算divide
                 //ROUND_HALF_UP:向“最接近的”整数舍入。 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
                 BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留两位小数.
           
                 System.out.println("结果集: " +divide);
             }

          结果集:

          Java使用BigDecimal公式精确计算及精度丢失问题

          二、 BigDecimal(舍入模式)选择

          简介:

          BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位、舍位、截断等操作

          java.math.RoundingMode:这是一种枚举类型,它定义了8种编程数据的舍入模式。它与java.math.BigDecimal类中定义的8个同名静态常量的作用相同,可用BigDecimal.setScale(int newScale, RoundingMode roundingMode)来设置数据的精度和舍入模式。

           

          1、ROUND_UP:向远离零的方向舍入。

                  若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。

          2、ROUND_DOWN:向接近零的方向舍入。

                  不论舍入位是否为零,都直接舍弃。即为向内取整模式。

          3、ROUND_CEILING:向正无穷大的方向舍入。

                  若 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;若为负,则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。

          4、ROUND_FLOOR:向负无穷大的方向舍入。

                  若 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;若为负,则舍入行为与 ROUND_UP 相同编程。即为向下取整模式。

          5、ROUND_HALF_UP:向“最接近的”整数舍入。

                &nbhttp://www.devze.comsp; 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。

          6、ROUND_HALF_DOWN:向“最接近的”整数舍入。

                  若舍入位大于5,则对舍入部分的前一位数字加1;若舍入位小于等于5,则直接舍弃。即为五舍六入模式。

          7、ROUND_HALF_EVEN:向“最接近的”整数舍入。

                  若(舍入位大于5)或者(舍入位等于5且前一位为奇数),则对舍入部分的前一位数字加1;

                  若(舍入位小于5)或者(舍入位等于5且前一位为偶数),则直接舍弃。即为银行家舍入模式。

          8、ROUND_UNNECESSARY

                  断言请求的操作具有精确的结果,因此不需要舍入。

                  如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

          案例: 

           public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
                 BigDecimal b = BigDecimal.valueOf(2.1);
                 //BigDecimal计算divide
                 //ROUND_HALF_UP:向“最接近的”整数舍入。 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
                 //ROUND_UP:向远离零的方向舍入。  若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。
                 BigDecimal divide = a.divide(b,BigDecimal.ROUND_HALF_UP, 2).setScale(2,ROUND_UP);
           
                 System.out.println("结果集: " +divide);
             }

          结果集:

          Java使用BigDecimal公式精确计算及精度丢失问题

          计算器结果集如下图:

          Java使用BigDecimal公式精确计算及精度丢失问题

          三、 BigDecimal.setScale用法案例

          BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位、舍位、截断等操作

          public  static void main(String[] args){
                 BigDecimal a = BigDecimal.valueOf(5.6);
                 BigDecimal b = BigDecimal.valueOf(2.1);
                 //BigDecimal计算divide
                 BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_UP).setScale(2, BigDecimal.ROUND_UP);
           
                 System.out.println("结果集: " +divide);
             }

          结果集:

          Java使用BigDecimal公式精确计算及精度丢失问题

          四、Java使用BigDecimal精度丢失问题

          介绍:

          在实际应用中,经常会使用到计算,举例如 '银行' 特别是在我们交易的时候,计算结果要求的更加精确,这个时候我们就会使用到java.math包中提供的API类BigDecimal,用于对超过16位有效位数的数字进行精确的计算。

          以如下代码为例:

          public  static void main(String[] args){
                 System.out.println("使用bigDecimal进行转换"+new BigDecimal(234.567));
             }

          运行后结果集出现精度丢失: 

          Java使用BigDecimal公式精确计算及精度丢失问题

          结果可以看出使用new BigDecimal(234.567),传入参数为double类型发生精度丢失,运行的结果并不等于234.567,而是为234.5670000000000072759576141834259033203125。

          原因是double不能表示为任何有限长度的二进制小数;

          解决方法:     使用new BigDecimal(String)构造函数,创建一个参数以字符串表示数值的对象

          public  static void main(String[] args){
                 double a = 234.567;
                 String  b = "234.567";
                 // 方式一:double的封装类Double中的toString()方法解决
                 System.out.println("使用bigDecimal进行转换" + new BigDecimal(new Double(a).to开发者_Python学习Stringandroid()));
           
                 // 方式二:使用String接收数值
                 System.out.println("使用bigDecimal进行转换" + new BigDecimal(b));
             }

           结果集如下:

          Java使用BigDecimal公式精确计算及精度丢失问题

          如需使用编程客栈加减乘除方法运算,可以使用BigDecimal类提供的add、subtract、multiply、divide方法实现 如上:Java使用BigDecimal公式计算

          总结

          到此这篇关于Java使用BigDecimal公式精确计算及精度丢失问题的文章就介绍到这了,更多相关Java使用BigDecimal公式精确计算内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

          0

          上一篇:

          下一篇:

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          最新开发

          开发排行榜