Steven5007

导航

BigDecimal加减乘除

import java.math.BigDecimal;

public class Testmath {
     public static void main(String[] args) { 
             String str1="2.30";
            BigDecimal bd=new BigDecimal(str1);
            System.out.println("字符串转BigDecimal:"+bd);
            
            BigDecimal num1 = new BigDecimal("100.68889");  
            BigDecimal num2 = new BigDecimal("2.5");  
            
            //加法
            BigDecimal result1 = num1.add(num2);
            System.out.println("和    是   :  " + result1);
            
            //减法 
            BigDecimal result2 = num1.subtract(num2);
            System.out.println("差    是   :  " + result2);
            
            //乘法
            BigDecimal result3 = num1.multiply(num2);
            System.out.println("积    是   :  " + result3);
            
            //除法
            BigDecimal result4 = num1.divide(num2);
            System.out.println("商    是   :  "+result4);
    
     }
}

结果:

===============================================

注意:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法

JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。

 

  BigDecimal result4 = num1.divide(num2,2,BigDecimal.ROUND_HALF_UP);

 

注意这个divide方法有两个重载的方法,一个是传两个参数的,一个是传三个参数的:

两个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数

@param roundingMode rounding mode to apply. 传入round的模式

三个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数
@param scale scale of the {@code BigDecimal} quotient to be returned. 传入精度
@param roundingMode rounding mode to apply. 传入round的模式

※ 注意:

1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。

2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!

因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
相关链接 : https://blog.csdn.net/haiyinshushe/article/details/82721234

3)小数位数及四舍五入规则

https://www.cnblogs.com/yadongliang/p/9066188.html

===========

相关链接:https://www.cnblogs.com/LeoBoy/p/5897754.html

posted on 2019-01-08 14:50  Steven5007  阅读(178)  评论(0编辑  收藏  举报