为了账号安全,请及时绑定邮箱和手机立即绑定

使用=比较Java中的浮点数有什么问题?

使用=比较Java中的浮点数有什么问题?

幕布斯6054654 2019-06-16 16:16:26
使用=比较Java中的浮点数有什么问题?根据这个java.sun页面 ==是Java中浮点数的相等比较运算符。但是,当我键入此代码时:if(sectionID == currentSectionID)在我的编辑器中运行静态分析,得到:“JAVA 0078浮点值与=相比”使用==要比较浮点值?正确的方法是什么?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

测试浮动是否“相等”的正确方法是:

if(Math.abs(sectionID - currentSectionID) < epsilon)

其中epsilon是一个很小的数字,如0.00000001,取决于所需的精度。


查看完整回答
反对 回复 2019-06-16
?
冉冉说

TA贡献1877条经验 获得超1个赞

只是为了给出其他人说的话背后的理由。

浮点数的二进制表示有点烦人。

在二进制语言中,大多数程序员都知道1b=1d,10b=2d,100b=4d,1000b=8d之间的相关关系。

嗯,它也是用另外一种方式工作的。

.1b=.5d,.01b=.25d,.001b=.125,.

问题是,没有精确的方法来表示大多数十进制数,如1,2,3等。你所能做的就是用二进制来表示。当数字打印时,系统会做一些模糊舍入,这样就可以显示.1,而不是.10000000000001或.999999999999(它们可能与存储的表示形式一样接近于.1)。

编辑评论:这是一个问题的原因是我们的期望。我们完全预计,当我们将2/3转换为十进制时,2/3会被伪造,无论是7、.67或.666667.但我们并不会自然而然地期望,1的四舍五入和2/3一样-这就是正在发生的事情。

顺便说一句,如果您好奇的话,它内部存储的数字是使用二进制“科学表示法”的纯二进制表示。所以,如果您告诉它存储十进制数10.75d,它将存储1010b的10,和.11b的小数。所以它会存储.1011,然后在结尾保存几个位,说:把小数点移到右边四位。

(虽然从技术上讲,它不再是小数点,但现在它是二进制点,但这一术语不会让大多数人更容易理解,因为他们会找到任何有用的答案。)


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 878 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信