小数计算不准确——java-API之BigDecimal类

BigDecimal类

概念

java中存在浮点数运算时会出现不精确的问题,这时BigDecimal工具类就可以解决此问题。
BigDecimal继承于Number类。

public class BigDecimalextends Number

创建对象

  • BigDecimal(double val) 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
double num1 = new Scanner(System.in).nextDouble();
BigDecimal bd = new BigDecimal(num1);
  • BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。推荐使用,因为double计算不准确
double num1 = new Scanner(System.in).nextDouble();
BigDecimal bd = new BigDecimal(num + "");

测试

import java.math.BigDecimal;
import java.util.Scanner;

public class Test1_Decimal {
	public static void main(String[] args) {
		doubleCompute(); // 浮点数计算不准确
		bigDecimalCompute();  //BigDecimal 解决小数不准确问题
	}
        /*
	 * 输入8.8和5.2
	 * 打印结果正常
	 */
	private static void bigDecimalCompute() {
                // 接收用户输入的值
		double num1 = new Scanner(System.in).nextDouble();
		double num2 = new Scanner(System.in).nextDouble();
		
		// 浮点数计算不准确,解决方案 BigDecimal
                // 温馨提示:最好不要用double的构造方法,最好用String的构造方法
		BigDecimal bd1 = new BigDecimal(num1 + "");
		BigDecimal bd2 = new BigDecimal(num2 + "");
		BigDecimal bd3;
		bd3 = bd1.add(bd2);  // 加法运算
		System.out.println(bd3);
		
		bd3 = bd1.subtract(bd2);  // 减法运算
		System.out.println(bd3);
		
		bd3 = bd1.multiply(bd2);  // 乘法运算
		System.out.println(bd3);
		
//		db3 = bd1.divide(bd2); //除法运算,除不尽会出现异常:java.lang.ArithmeticException
		//divide(x,y,z) x是被除的对象  y表示保留的小数位数,z是保留默认通常选择四舍五入。
		bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);
		System.out.println(bd3);
		
		
	}
	/*
	 * 输入8.8和5.2
	 * 打印结果不准确
	 */
	private static void doubleCompute() {
                // 接收用户输入的值
		double num1 = new Scanner(System.in).nextDouble();
		double num2 = new Scanner(System.in).nextDouble();
		// 运算 结果不准确
		System.out.println(num1 + num2);  // 14.0
		System.out.println(num1 - num2);  // 3.6000000000000005
		System.out.println(num1 * num2);  // 45.760000000000005
		System.out.println(num1 / num2);  // 1.6923076923076923
	}
}

posted @ 2020-03-05 14:07  技术狂-CYL  阅读(472)  评论(0)    收藏  举报