java中BigDecimal的使用

为了能精确表示,计算浮点数,Java提供了BigDecimal类。
使用BigDecimal(String val)构造器的结果是可预知的,写new BigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1,。因此通常建议优先使用基于String的构造器。

使用BigDecimal(double val)构造器时,具有一定的不可预知性。当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,它实际上等于一个近似0.1的数。

public class DoubleTest
{
	public static void main(String args[])
	{
		System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
		System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
		System.out.println("4.015 * 100 = " + (4.015 * 100));
		System.out.println("123.3 / 100 = " + (123.3 / 100));
	}
}

0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999

public class BigDecimalTest
{
	public static void main(String[] args)
	{
		BigDecimal f1 = new BigDecimal("0.05");
		BigDecimal f2 = BigDecimal.valueOf(0.01);
		BigDecimal f3 = new BigDecimal(0.05);
		System.out.println("使用String作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.01 = " + f1.add(f2));
		System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f1.divide(f2));
		System.out.println("使用double作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.01 = " + f3.add(f2));
		System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f3.divide(f2));
		System.out.println("使用double作为BigDecimal构造器参数2:");
		System.out.println("0.05 + 0.01 = " + f3.add(f1));
		System.out.println("0.05 - 0.01 = " + f3.subtract(f1));
		System.out.println("0.05 * 0.01 = " + f3.multiply(f1));
		System.out.println("0.05 / 0.01 = " + f3.divide(f1));
	}
}

使用String作为BigDecimal构造器参数:
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
使用double作为BigDecimal构造器参数:
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125
使用double作为BigDecimal构造器参数2:
0.05 + 0.01 = 0.10000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 2.77555756156289135105907917022705078125E-18
0.05 * 0.01 = 0.0025000000000000001387778780781445675529539585113525390625
0.05 / 0.01 = 1.000000000000000055511151231257827021181583404541015625

包装后的BigDecimal进行四则运算:

public class Arith
{
	// 默认除法运算精度
	private static final int DEF_DIV_SCALE = 10;
	// 构造器私有,让这个类不能实例化
	private Arith()	{}
	// 提供精确的加法运算。
	public static double add(double v1,double v2)
	{
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).doubleValue();
	}
	// 提供精确的减法运算。
	public static double sub(double v1,double v2)
	{
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.subtract(b2).doubleValue();
	}
	// 提供精确的乘法运算。
	public static double mul(double v1,double v2)
	{
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.multiply(b2).doubleValue();
	}
	// 提供(相对)精确的除法运算,当发生除不尽的情况时.
	// 精确到小数点以后10位的数字四舍五入。
	public static double div(double v1,double v2)
	{
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2 , DEF_DIV_SCALE
			, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	public static void main(String[] args)
	{
		System.out.println("0.05 + 0.01 = "
			+ Arith.add(0.05 , 0.01));
		System.out.println("1.0 - 0.42 = "
			+ Arith.sub(1.0 , 0.42));
		System.out.println("4.015 * 100 = "
			+ Arith.mul(4.015 , 100));
		System.out.println("123.3 / 100 = "
			+ Arith.div(123.3 , 100));
	}
}


JavaBigDecimal是用于高精度计算的类。它可以处理非常大或非常小的数值,并提供了精确的计算结果。关于BigDecimal的一些重要用法和特点如下所述: 1. 构造方法: BigDecimal类有多个构造方法。其,可以使用double类型或String类型的参数来创建BigDecimal对象。当使用double类型参数创建BigDecimal对象时,需要注意double类型的不精确性,可能会导致计算结果不准确。因此,在使用double类型参数创建BigDecimal对象时,最好使用String类型参数来确保精确性。 2. 精确计算: BigDecimal提供了各种精确计算的方法,如加法、减法、乘法和除法。这些方法可以通过调用BigDecimal对象的相应方法来执行计算。需要注意的是,BigDecimal的除法方法可能会抛出ArithmeticException异常,例如当除数为0时。为了避免这种情况,建议使用除法方法的重载方法,指定小数位数和舍入模式。 3. 不可预知性: 在使用参数类型为double的构造方法时,需要注意其不可预知性。由于double类型的不精确性,可能会导致无法准确表示某些数值,以及计算结果的不准确性。因此,在需要精确计算的场景,建议使用String类型的构造方法来创建BigDecimal对象。 总结起来,BigDecimalJava用于高精度计算的类。它可以处理大型或小型数值,并提供精确的计算结果。在使用BigDecimal时,应注意使用适当的构造方法来创建对象,并使用精确计算方法来执行计算。此外,对于需要精确计算的场景,建议使用String类型的构造方法来创建BigDecimal对象,以避免double类型的不准确性带来的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [javaBigDecimal详解及使用](https://blog.csdn.net/u012060033/article/details/109983829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [java BigDecimal 详解](https://blog.csdn.net/qq_35868412/article/details/89029288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值