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
===========
相关链接:https://www.cnblogs.com/LeoBoy/p/5897754.html