两个浮点数值的比较

因为以前学习过 C 语言,所以对于 java 的数据类型结构这一块就略过了,不过今天在看书的时候偶然间看到了一个关于浮点数比较的问题,相信有很多同学在学习数据类型这一块都不是很仔细,于是写个博客提出来,权当是做个笔记吧。

double x = 1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1;
  x 的结果会是多少呢?一开始我很笃定,x = 0.5。但事实真的是这样么?因为浮点类型和双精度类型的数据都不是精确的,所以 x 并不是精确的等于 0.5,而是 0.5000000000000001。所以,直接拿 x 和 0.5 比较肯定是会出问题的。那么问题来了,应该如何比较两个浮点数的值是不是相等的呢?

一般的方法肯定是行不通的,这里我们要使用逼近的方法。什么意思呢?虽然浮点类型和双精度类型的数据不是精确的,但是它们和精确的数值相差不大,我们可以设定一个非常小的容许差值,只要两个浮点类型或者是双精度类型的差值小于我们设定的容许差值即可认为两个数是近似相等的,即 |x - y| < ε(x、y 为两个浮点类型或者双精度类型的数据,ε 为容许差值)。那么这个容许差值 ε 应该设置多大?

通常,在比较两个双精度(double)类型的数值时,ε 设置为 1E-14,而在比较两个单精度(float)类型的数值时,ε 设置为 1E-7。

final double EPSILON = 1E-14;
doulbe x = 1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1;
if(Math.abs(x - 0.5) < EPSILON)
{
      System.out.println("x约等于0.5");
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值