java二进制运算十进制(精确运算)

public static void main(String[] args) {
		System.out.println(2.0-1.1);
	}
}

打印出来如图所示,等于 0.8999999999999999 

为什么呢?

java中的double值用在数学方面来运算是没有问题.

但是在二进制中,计算十分之一(1/10)就会出现无限循环的数.

同理在十进制中,对三分之一进行运算会出现无限循环的数字.(1/3 => 0.333333333333)

怎么不让java编译不出现这种情况呢 ! 

java就提供了一个类,专门做整数操作的(BigInteger),还有一个类专门做浮点类型操作的(BigDecimal),它们都是Number的子类.

在BigDecimal的类里面有String构造器来构造.

例如在java编译器里,下面的乘法运算BigDecimal构造器,.

b1=获得book的值+"" 转成字符串.

b2=获得quantity的值.

b3=b1乘以(b2).

返回一个b3的double值.

public double getSubtotal(){
		/*
		 * 使用BigDecimal不会有误差
		 * 要求必须使用String类型的构造器
		 */
		BigDecimal b1 = new BigDecimal(book.getCurrPrice() + "");	//一加 "" 就让这个数变成字符串了
		BigDecimal b2 = new BigDecimal(quantity + "");
		BigDecimal b3 = b1.multiply(b2);							//multiply 乘以
		return b3.doubleValue();
		// 转换为上面的写法	return book.getCurrPrice() * quantity;
	}

这样使得在二进制里面的运算不会产生误差.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值