我正在将一些代码从Processing转移到Java,而我遇到的一个问题是处理的预编译器将任何双精度转换为浮点数。但是在Eclipse中,我必须显式地将我的值转换为float。尽管如此,我还是得到了一些我不理解的错误。例如,不应该在此语句的末尾加上f修复类型不匹配(类型不匹配:无法从double转换为 浮动)?
springing[n] = .05*(.17*(n+1))f;
即使是像这样简单的陈述,我也会遇到类型不匹配的问题。我做错了什么?
float theta = .01f;
答案 0 :(得分:11)
嗯,你的第二个陈述是正确的Java标准,但在你的第一个例子中,Java可能试图阻止你将双精度转换为浮点数,因为程序员必须明确要求精度损失,如下所示:
double a = //some double;
float b = (float) a; //b will lose some of a's precision
答案 1 :(得分:1)
根据Java语法,f
后缀仅适用于浮点文字。你的第二个陈述应该有效。第一个是表达式,因此需要演员:
springing[n] = (float)(.05*(.17*(n+1)));
答案 2 :(得分:1)
在第一个示例中,f
后缀仅对文字直接有效,而不是在整个表达式之后。所以用这两种方式写它(假设springing是一个float []):
springing[n] = .05f*(.17f*(n+1));
springing[n] = (float)( .05*(.17*(n+1)));
第一个在float中进行整个计算(除n+1
部分之外),第二个以double计算,然后只将结果转换为float。
(在这两种情况下,.05
和.17
(以及匹配的一个)之间的括号通常是多余的,因为乘法是关联的。它可能对{{{{}的真正大值有所不同。 1}},但在这些情况下,你通常会想要另一种方法来避免溢出。)