【发布时间】:2013-09-18 13:31:45
【问题描述】:
我正在编写一个带有浮点数的示例程序,但突然发生了一些奇怪的事情。如果有人能从我的程序中解释为什么我会面临这种行为,我将不胜感激。
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");
}
}
}
输出:
3.2 different
6.5 same
在改变 f2 的值进行一些测试后,我注意到我得到了 f2 > 3.5 的意外结果,这是为什么?任何意见都非常感谢。
谢谢
【问题讨论】:
-
双双双双双双双双。
-
因为 6.5 可以用二进制浮点数精确表示,与 3.2 不同。
-
@LeeMeador Java 中的规则是,当转换为浮点数或双精度数时,将数字四舍五入到可以表示的最接近的值,如果等距,则舍入到最低有效位为 0 的值。这适用于文字和转换,因此对于 3.2f,浮点值将是最接近 3.2 的值;对于 (float)3.2,文字 3.2 表示最接近 3.2 的 double,然后强制转换为 float 会导致结果是最接近该 double 的浮点值。这两个通常应该产生相同的浮点数,但应该有一些罕见的极端情况不会。
标签: java