浮点类型使用陷阱,逻辑 短路与或的区别

引言

当我们进行条件判断时,经常会遇到两个数是否相等的情况,但如果在程序中进行判断一个可以除尽的小数和数学上除出来所得的数是否相等时,就会神奇的发型居然不相等??!

遇到问题浮点类型使用陷阱

看如下代码

double num5 = 2.7;//2.7
		double num6 = 8.1 / 3;//接近2.7
		System.out.println(num5);
		System.out.println(num6);
		if(num5 == num6){
			System.out.println("相等");//输出失败
		}

输出居然是这样:

分析问题

出现了 2.7 != 8.1 / 3的情况.这段代码没有输出"相等"的原因是浮点数在计算机中的表示并不总是精确的。num6是通过8.1 / 3计算得到的,这个计算在理论上应该等于2.7,但由于浮点数的表示方式,计算结果可能会稍微偏离这个精确值。当你使用==操作符来比较两个浮点数时,你实际上是在比较它们内部的二进制表示是否完全相同。由于num5num6可能由于上述原因而有微小的差异,所以它们的二进制表示可能不完全相同,导致if(num5 == num6)的条件不满足。

解决问题

那么如何解决这个问题呢?

以两个数的差值的绝对值,在某个精度范围内判断

double num5 = 2.7;//2.7
		double num6 = 8.1 / 3;//接近2.7
		System.out.println(num5);
		System.out.println(num6);
		if(num5 == num6){
			System.out.println("相等");//输出失败
		}
		System.out.println(Math.abs(num5 - num6));
		if(Math.abs(num5 - num6) < 0.0001){
			System.out.println("差值小于规定精度,认为相等");//成功输出
		}

这样就输出成功了

总结:

当我们对运算结果是小数的进行相等判断时要小心
 应该以两个数的差值的绝对值,在某个精度范围内判断

逻辑 短路

短路与&&逻辑与&区别:

对于短路与&&来说,如果第一个条件判断为false,后面条件不会判断

对于逻辑与&来说,如果第一个条件判断为false,后面条件会继续判断

短路与或|和逻辑或|区别:

同理,短路或第一个条件为true,后面条件就不会在判断,结果为真。

逻辑或第一个条件无论为真假,后面条件还会在判断。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值