在看到下面的代码片段的结果后,我对浮点数的行为感到困惑.
float var1 = 5.4f;
float var2 = 5.5f;
if(var1 == 5.4)
System.out.println("Matched");
else
System.out.println("Oops!!");
if(var2 == 5.5)
System.out.println("Matched");
else
System.out.println("Oops!!");
Run Code Online (Sandbox Code Playgroud)
输出:
Oops!!
Matched
Run Code Online (Sandbox Code Playgroud)
这是因为十进制数不能完全代表基本2二进制格式吗?或者这是因为我将float类型变量与double类型进行比较时的精度?如果是,那为什么它适用于下一个变量?
如果我使用这样的比较是安全的(a是int,b和c是float/double):
a == b
b == c
Run Code Online (Sandbox Code Playgroud)
它可能听起来很荒谬,但在我的旧编程语言中,有时1 + 2 == 3是假的(因为左侧返回2.99999999999 ......).那么,这个:
Math.sqrt(b) == Math.sqrt(c)
b / 3 == 10 / 3 //In case b = 10, does it return true?
Run Code Online (Sandbox Code Playgroud) 我正在编写一个带浮动的示例程序,但突然发生了一些奇怪的事情.我真的很感激,如果有人能够阐明我为什么要从我的计划中面对这样的行为.
package Programs;
public class FloatTest {
/**
* @param args
*/
public static void main(String[] args) {
float f1 = (float) 3.2;
float f2 = (float) 6.5;
if (f1 == 3.2) {
System.out.println(f1 + " same");
} else {
System.out.println(f1 + " different");
}
if (f2 == 6.5) {
System.out.println(f2 + " same");
} else {
System.out.println(f2 + " different");
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
3.2 different
6.5 same
Run Code Online (Sandbox Code Playgroud)
在做了一些改变f2值的测试后,我注意到f2> 3.5得到意想不到的结果为什么会这样?任何输入都非常感谢.
谢谢
我刚刚经历了一个比较两个数字的bug,我发现以下内容很有趣:
assert 1 == 1;//true
assert 1d == 1;//true
assert 1 == 1f;//true
assert 1d == 1f;//true
assert 1.1 == 1.1;//true
assert 1.1d == 1.1;//true
assert 1.1 == 1.1f;//false
assert 1.1d == 1.1f;//false
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么只有最后两个陈述是假的?