int x1, x2; double d;
d = (int)(Math.sqrt(b*b - 4*a*c));
if (d >= 0) {
x1 = (-b + d) / 2*a; // on this line
答案 0 :(得分:7)
此处x1
不应该是int
。您似乎正在使用它来存储二次方程的根,当然这可能不是一个整数。
将x1
(也可能x2
)更改为double
,问题就会消失。
顺便说一下,你需要2 * a
左右的括号,否则你有效地将a
放在分子上,而不是分母。
答案 1 :(得分:1)
d
是双倍的,因此(-b + d)
是双倍的。即使b
不是双倍的,它也会扩展到该表达式的一个。因此,(-b + d) / 2*a
是双倍的。 Java不会让你隐式地将这个双重表达式转换为int
,因为你可能会失去精确度。
答案 2 :(得分:1)
您只需在要将int
计算结果存储到double
的位置int
进行投射:
public class Test {
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double c = 2.0;
int x1, x2;
double d;
d = Math.sqrt(b * b - 4 * a * c);
if (d >= 0) {
x1 = (int) ((-b + d) / 2 * a); // on this line
}
}
}
您还应该再看看您在哪里进行符号测试d >= 0
。它会起作用,因为Math.sqrt
调用的结果是非负数或NaN,但在调用之前测试平方根操作数会更清楚。
答案 3 :(得分:0)
您的错误来自:
x1 = (-b + d) / 2*a;
您的变量仍然定义为double。当你将它添加到-b时,它将返回一个double。 尝试将此行另存为新的int变量而不是d:
Int temp = (int)(Math.sqrt(b*b - 4*a*c));
答案 4 :(得分:0)
d
仍然是双倍的,因为它被声明为双精度数。仅强制转换会更改值的类型;它不会将d
本身更改为int
。如果您希望d
成为int
,请将其声明为int
,如下所示:
int d;
而不是
double d;
并保持其余代码相同。这应该可以解决问题。
答案 5 :(得分:0)
如果您最终以int结尾,则可以执行以下操作:
double answer = (-b + d) / 2*a;
x1 = new Double(answer).intValue();
否则,其他答案已经充分告诉你为什么你遇到了投射问题。