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

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

根据这个java.sun页面 ==是Java中浮点数的相等比较运算符。

但是,当我键入此代码时:

if(sectionID == currentSectionID)

在我的编辑器中运行静态分析,得到:“JAVA 0078浮点值与=相比”

使用==要比较浮点值?正确的方法是什么?


幕布斯6054654
浏览 885回答 3
3回答

阿晨1998

测试浮动是否“相等”的正确方法是:if(Math.abs(sectionID&nbsp;-&nbsp;currentSectionID)&nbsp;<&nbsp;epsilon)其中epsilon是一个很小的数字,如0.00000001,取决于所需的精度。

冉冉说

只是为了给出其他人说的话背后的理由。浮点数的二进制表示有点烦人。在二进制语言中,大多数程序员都知道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,然后在结尾保存几个位,说:把小数点移到右边四位。(虽然从技术上讲,它不再是小数点,但现在它是二进制点,但这一术语不会让大多数人更容易理解,因为他们会找到任何有用的答案。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java