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 ...
答案 0 :(得分:2)
假设points
为int
,则为:
points / word.length()
是int
分区,因此结果为int
。如果结果具有小数部分,则将向下舍入以适合int
。
如果您想要/需要float
或double
结果,则必须为其中一个操作数输入float
或double
。
从代码看起来,没有错误,也没有警告。这似乎是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有助于确认这一点(在提交错误报告时非常有用)。