【问题标题】:Cast from float to double从浮点数转换为双数
【发布时间】:2018-02-19 10:02:11
【问题描述】:

谁能解释一下为什么这段代码不能编译:

boolean r = (boolean) 0;

为什么会编译这个?

double z = (float) 2.0_0+0___2;

我看不懂浮点数后面的数字是用什么字母写的。

【问题讨论】:

  • 1:Java 中没有从 int 到 boolean 的强制转换。 2:数字文字中的下划线被忽略。
  • 小心以0 开头的数字,因为java 将这些数字作为八进制数处理。例如:int i = 010;System.out.println(i); 将打印 8

标签: java casting compilation boolean expression


【解决方案1】:

第一个无法编译,因为您根本无法将数字转换为booleanbooleantruefalse

第二个只使用下划线,can be used to separate numbers 类似于2_000_000 以提高可读性。在这种情况下,它们用于降低可读性,就像转换为 float 一样(double 转换为 float 并分配给 double 在这种特殊情况下没有任何作用)。

后一种情况似乎是为混淆而设计的,因为有几个陷阱。如果我们删除不必要的下划线,我们会得到2.00+02,它添加了一个文字double 和一个octal 02。这仍然基本上只是2+2,但如果八进制值是0___10,你会得到z = 10 的结果。然后您将强制转换为float,这可能会影响最终结果,因为 64 位被强制转换为 32 位,然后又回到 64 位。这可能会使最终结果的精确度低于没有演员表的情况。

【讨论】:

    【解决方案2】:

    在某些语言中,如 PHP 或 Javascript 0 是虚假的,即不是 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2018-04-26
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多