"不必要的演员浮动"似乎有必要。我错过了什么?

时间:2014-10-13 19:49:38

标签: java netbeans casting

Netbeans * 7.4 * 告诉我“这条线上不必要的施法”:

int points; // EDIT *********************
String word; 

appendOutput(word + 
                  (points > 0 
                  ? "\t" + round((float)points/word.length(),2)  
                  : "")); 

但是如果我删除(float),输出会被截断(因为它应该在这种情况下)到小于points/word.length的最大整数。

那么Netbeans会怎么样?如果我想要正确的输出到百分之一,我必须忽略它删除(float)的建议。

或者我做错了什么/不好吃或只是错过了什么?

*编辑*

嘿......忘了我写了自己的round方法:

  public static double round(float x, int n){
    return Math.floor((0 + Math.pow(10, n)*x + 0.5)) / Math.pow(10, n);  
  }

* MCVE *

public class JavaApplication66 {

  public static void main(String[] args) {

    int points = 23; // EDIT *********************
    String word = "FOO"; 

    System.out.println(word + 
                (points > 0 
                ? "\t" + round((float)points/word.length(),2)  
                : ""));
}

public static double round(float x, int n){
  return Math.floor((0 + Math.pow(10, n)*x + 0.5)) / Math.pow(10, n);  
}

}

**编辑**刚刚将(float)添加到MCVE ... augh ...

2 个答案:

答案 0 :(得分:2)

假设pointsint,则为:

points / word.length()

int分区,因此结果为int。如果结果具有小数部分,则将向下舍入以适合int

如果您想要/需要floatdouble结果,则必须为其中一个操作数输入floatdouble

从代码看起来,没有错误,也没有警告。这似乎是Netbeans中的一个错误。使用round方法的正确签名,可以通过使用javac或使用Eclipse或Intellij等其他IDE测试类似代码来证明这一点。


通过round方法的实现,我编写了这个例子来重现Eclipse和Intellij中的问题。

public class Test {
    public static double round(float x, int n){
        return Math.floor((0 + Math.pow(10, n)*x + 0.5)) / Math.pow(10, n);  
    }
    public static void main(String[] args) {
        int points = 0;
        String word = "foo";
        StringBuilder appendOutput = new StringBuilder();
        appendOutput.append(word + 
            (points > 0 
                ? "\t" + round((float)points/word.length(),2)  
                : ""));
    }
}

这些IDE都没有发出警告,因此看起来像是Netbeans中的一个错误。

答案 1 :(得分:1)

根据我们所知,我不认为你错过任何东西。它看起来像Netbeans中的一个错误。

由于(float)绑定到points而不是绑定的结果,所以演员改变了程序的语义,并且不能合理地描述为"不必要&#34 ;

MCVE有助于确认这一点(在提交错误报告时非常有用)。