I am working on the program below. How do you calculate totalCostPerMiles = (numMiles / milesPerGallon) * price;
when totalCostPerMiles
is a int
, numMiles
and milesPerGallon
are doubles
, and price
is a int
to get the calculated value?
Suppose milesPerGallon = 30;
, numMiles = 15;
, and price = 400;
.
I need numMiles / milesPerGallon
to output 0.5 instead of 0 and totalCostPerMiles
to output 200 instead of 0.
All variables storing measured values must be doubles and all variables storing monetary values must be integers.
import java.util.Scanner; public class RoadTrip { public static void main(String[] args) { int price, budgetPrice, priceInDollars, priceInCents, priceInDollarsBudget, priceInCentsBudget, totalCostPerMiles, dollars, cents; double milesPerGallon, numMiles, totalMilePerGall; Scanner stdin = new Scanner(System.in); milesPerGallon = stdin.nextDouble(); numMiles = stdin.nextDouble(); price = stdin.nextInt(); budgetPrice = stdin.nextInt(); totalCostPerMiles = (numMiles / milesPerGallon) * price; //produces error
Advertisement
Answer
math ops are always binary (so, 2 arguments. ‘a+b+c’ is not a 3-way addition; it’s shorthand for (a+b)+c
– 2 nested binary operations.
If either ‘side’ of the binary operation is a double, then first the other number (int, long, float, byte, char, short, doesn’t matter) is converted to a double, then the operation is done, and the result is a double.
So, (numMiles / milesPerGallon)
is an expression of type double.
Then, you do that (so, a double), times an int: that * price
. price is an int, but double*int
is done by first converting that int to a double. Thus, the entire result is, itself, a double.
You then try to assign that to an int, and that’s where the problem occurs: You can’t do that, because java has no idea what you want. Should 6.5
become 6, or 7? What about 1.239e123
?
You can choose what to do. The simplest way is the ‘lop off rounding’ mode, which lops off the fraction (so, round down.. unless the number is negative, in which case that’d round up):
totalCostPerMilis = (int) ((numMiles / milesPerGallon) * price);
you can even use this and go with different rounding options: Add 0.5 to the mix and now it’s rounding to nearest, with x.5
rounding up.
Other stuff can be found with e.g. Math.round()
.