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));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值