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

- 37
- 7
-
Maybe try casting d to an `Integer` instead of an `int`? – Santiago Benoit Jan 06 '15 at 21:41
-
2@Santiago: That still wouldn't work. – Makoto Jan 06 '15 at 21:42
-
1I'm not clear on why there are any integers involved in this code anyway. The roots of a quadratic equation are not necessarily integers, so what exactly are you trying to accomplish by using integers and trying to convert to integers? – ajb Jan 06 '15 at 21:52
6 Answers
Here x1
shouldn't be an int
. It looks like you're using it to store a root of a quadratic equation, which of course is likely not to be a whole number.
Change x1
(and probably x2
too) to be a double
and the problem will go away.
Incidentally, you want parentheses around 2 * a
, otherwise you're effectively putting a
on the numerator, not the denominator.

- 77,785
- 15
- 98
- 110
-
-
1@ajb Yes, that's true. The `if` can also be removed, since `Math.sqrt()` always either returns something `>= 0`, or throws an exception. – Dawood ibn Kareem Jan 06 '15 at 21:51
-
@DavidWallace If the argument is negative, Math.sqrt returns a NaN, rather than throwing an exception. Whether it needs to be tested depends on what the code is supposed to do for an equation with no real solutions. – Patricia Shanahan Jan 06 '15 at 22:40
-
Oops, my bad. I forgot about `NaN`. Thanks @PatriciaShanahan. Of course, the best thing for this code to do would be to check the sign of `b * b - 4 * a * c` before trying to square root it. – Dawood ibn Kareem Jan 06 '15 at 22:46
d
is a double, so (-b + d)
is a double. Even if b
isn't a double, it'll get widened to one for that expression. Therefore, (-b + d) / 2*a
is a double. Java won't let you implicitly convert that double expression to an int
, because you could lose precision.

- 42,327
- 7
- 87
- 124
-
1I think the issue is that he thinks when he is type casting that he is actually changing the variable type instead of actually casting the value. – Iootu Jan 06 '15 at 21:42
You simply need to do a cast to int
at the point where you want to store the result of a double
calculation into an 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
}
}
}
You should also take another look at where you are doing the sign test d >= 0
. It will work, because the result of a Math.sqrt
call is either a non-negative number or a NaN, but testing the square root operand before the call would be clearer.

- 25,849
- 4
- 38
- 75
Your error is from:
x1 = (-b + d) / 2*a;
Your variable did still defined as a double. When you add it to -b this will return a double. Try saving this line as a new int variable instead of d:
Int temp = (int)(Math.sqrt(b*b - 4*a*c));

- 599
- 10
- 24
d
is still a double, because it was declared as a double. Casting only changes the type of a value; it won't change d
itself to an int
. If you want d
to be an int
, declare it as an int
, like this:
int d;
instead of
double d;
and keep the rest of your code the same. This should fix the problem.

- 994
- 1
- 8
- 22
If you're deadset on ending up with an int, you can do the following:
double answer = (-b + d) / 2*a;
x1 = new Double(answer).intValue();
Otherwise, the other answers have sufficiently told you why you're running into issues with casting.
-
What is the advantage of boxing the `double` to a `Double` and using `intValue()`, as opposed to just casting to `(int)`? Isn't that just redundant code to do the same thing? – ajb Jan 06 '15 at 21:54
-
@ajb, it is, just presenting an alternative. If you want to get clever about it one could use Math.round() and then Long.intValue() as well. They all get to the same end. – Foosh Jan 06 '15 at 22:01