从float转换为double

4

请问有人能解释一下为什么这段代码无法编译:

boolean r = (boolean) 0;

为什么这个可以编译?
double z = (float) 2.0_0+0___2;

我不理解浮点数后面的数字所写的字母表。


第二部分请参见此页面:https://docs.oracle.com/javase/8/docs/technotes/guides/language/underscores-literals.html - Arnaud
1: Java中没有从int到boolean的强制转换。 2: 数字文字中的下划线会被忽略。 - khelwood
1
注意以 0 开头的数字,因为 Java 会将其视为八进制数。例如:int i = 010;System.out.println(i); 将输出 8 - user8097737
2个回答

9

第一种方法无法编译,因为你不能将数字强制转换为 boolean。一个 boolean 只能是 truefalse

第二种方法只是使用下划线 分隔数字,例如 2_000_000 以提高可读性。但在这种情况下,它们被用来降低可读性,同时进行了 float 的转换(将 double 转换为 float 并赋给 double 在这种特定情况下没有任何作用)。

后一种情况似乎是为了混淆而设计的,因为存在几个陷阱。如果我们去掉不必要的下划线,我们得到2.00+02,其中添加了一个八进制02的字面量double。这基本上仍然只是2+2,但如果八进制值为0___10,则会得到z = 10的结果。然后你需要强制转换为float,这可能会影响最终结果,因为64位被强制转换为32位,然后再返回到64位。这可能使最终结果比没有强制转换更不精确。

0
在某些语言中,如PHP或Javascript,0是falsy的,也就是说,它不是false,但被评估为一个boolean值,它将是false。在C中,0是false。这些都是你期望的可能原因。然而,在Java中,你不能将数字转换为boolean。如果你想要进行真实的评估,你可以实现帮助方法,比如:
public class LooselyTyped {
    public boolean toBoolean(int input) {
        return input != 0;
    }

    public boolean toBoolean(Object input) {
        return (input != null) && (!input.equals(""));
    }
}

然后:

boolean lt = LooselyTyped.toBoolean(yourvariable);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接