E754浮点数运算误差用Bigdecimal解决

java.math. Bigdecimal


double类型:1.0-0.8的结果不是0.2,而是0.19999999999999996

所以常用if(abs(result)<(pow(1,-6)))判断为相等

你使用别的程序语言(如 Javascript.、 Python等)也有可能显示这个结果。
简单来说,Java(包括其他程序语言)遵守E754浮点数运算( Floating- -Point Arithmetic规范,使用分数与指数来表示浮点数。例如,0.5会使用1/2来表示,0.75会使用1/2+1/4来表示,0.875会使用1/2+14+18来表示,而0.1会使用16+1/32+1256+1/512+1/4096+18192+…无限循环下去,无法精确表示,因而造成运算上的误差
再来举个例子,你觉得以下程序片段会显示什么结果?
package hello;

public class BigDecimal {
	
	public static void main(String[] args) {
		
		double a=0.1,b=0.1,c=0.1;
		
		if((a+b+c)==0.3) {
			
			System.out.println("相等");
			
		}else {
			System.out.println("不相等");
		}

	}
	
}


由于浮点数误差的关系,结果是显示“不等于0.3”。类似的例子还很多,结论就是,如果要求精确度,那就要小心使用浮点数,而且别用=直接比较浮点数运算结果

可以使用java.math.Bigdecimal类.

                BigDecimal op1=new BigDecimal("1.0");
		BigDecimal op2=new BigDecimal("0.8");
		BigDecimal result=op1.subtract(op2);
		System.out.println(result);

输出为0.2.

同理new Bigdecimal 三个0.1调用add判断结果为相等

if(op.add(op2).add(op3).equals(result))

3、

                BigDecimal op1=new BigDecimal("1.0");
		BigDecimal op2=new BigDecimal("1.0");
             System.out.println(op1==op2);//false
              System.out.println(op1.equals(op2));//true


因为用==比较op1、op2,两者为两个新建的不同BigDecimal,

而equals 比较的是内含值0.1所以true


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值