Java中使用BigDecimal进行精确运算

使用BigDecimal进行精确运算

问题

  • 代码示例:
public class BigDecimalTest {
	public static void main(String[] args) {
		System.out.println(0.06 + 0.01);
		System.out.println(1.0 - 0.42);
		System.out.println(4.015 * 100);
		System.out.println(303.1 / 1000);
	}
}
  • 输出:
0.06999999999999999
0.5800000000000001
401.49999999999994
0.30310000000000004
  • 之所以无法算出预期结果,原因在于计算机是二进制的: 浮点数没有办法用二进制进行精确表示
  • CPU中使用指数尾数表示浮点数:
    • 这样的表示方法一般都会失去一定的精度
    • 浮点数的运算也会产生误差
  • Java中的float只能用来进行科学计算或者工程计算,在大多数商业计算中,一般采用java.math.BigDecimal类来进行精确计算

BigDecimal类

  • 使用BigDecimal进行精确计算的步骤:
    • 使用float或者Double变量构建BigDecimal对象
    • 通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算
    • 将BigDecimal对象转换成float,double,int等类型

构建BigDecimal对象

  • 可以使用BigDecimal的构造方法或静态方法valueOf() 将基本类型构建成BigDecimal对象:
BigDecimal n1 = new BigDecimal(Double.toString(0.52));

BigDecimal n2 = BigDecimal.valueOf(0.48);

BigDecimal计算

  • BigDecimal类提供了相应的成员方法进行加,减,乘,除计算:
/**
 * 加法
 */
public BigDecimal add(BigDecimal value);

/**
 * 减法
 */
public BigDecimal subtract(BigDecimal value);

/**
 * 乘法
 */
public BigDecimal multiply(BigDecimal value);

/**
 * 除法
 */
public BigDecimal divide(BigDecimal value);
  • 进行相应的计算后,需要通过调用floatValue()doubleValue() 等方法将BigDecimal对象转换成相应的基本数据类型的变量

猜你喜欢

转载自blog.csdn.net/JewaveOxford/article/details/107976823