parse - Java JDK-posible conversión con pérdida de doble a int
java integer part of double (2)
Así que recientemente escribí el siguiente código:
import java.util.Scanner;
public class TrainTicket
{
public static void main (String args[])
{
Scanner money = new Scanner(System.in);
System.out.print("Please type in the type of ticket you would like to buy./nA. Child B. Adult C. Elder.");
String type = money.next();
System.out.print("Now please type in the amount of tickets you would like to buy.");
int much = money.nextInt();
int price = 0;
switch (type)
{
case "A":
price = 10;
break;
case "B":
price = 60;
break;
case "C":
price = 35;
break;
default:
price = 0;
System.out.print("Not a option ;-;");
}
if (price!=0)
{
int total2 = price* much* 0.7;
System.out.print("Do you have a coupon code? Enter Y or N");
String YN = money.next();
if (YN.equals("Y"))
{
System.out.print("Please enter your coupon code.");
int coupon = money.nextInt();
if(coupon==21)
{
System.out.println("Your total price is " + "$" + total2 + ".");
}
else
{
System.out.println("Invalid coupon code, your total price is " + "$" + price* much + ".");
}
}
else
{
System.out.println("Your total price is " + "$" + price* much + "." );
}
}
money.close();
}
}
Sin embargo, sigue mostrando esto:
TrainTicket.java:31: error: incompatible types: possible lossy conversion from double to int
int total2 = price* much* 0.7;
Cuando intento ejecutarlo con cmd.
¿Alguien puede ayudar y explicar el error que he cometido? Cualquier ayuda es apreciada :). ¡Gracias!
Cuando convierte double
a int
, la precisión del valor se pierde. Por ejemplo, cuando convierte 4.8657 (doble) en int. El valor int será 4.Primitive int
no almacena números decimales. Así perderá 0.8657.
En su caso, 0.7 es un valor doble (punto flotante tratado como doble por defecto a menos que se mencione como float-0.7f). Cuando se calcula el price*much*0.7
, la respuesta es un valor doble y, por lo tanto, el compilador no le permite almacenarlo en un entero de tipo, ya que podría haber una pérdida de precisión. Así que esa es la possible lossy conversion
, puede perder precisión
Entonces, ¿qué podrías hacer al respecto? Necesitas decirle al compilador que realmente quieres hacerlo. Debes decirle que sabes lo que estás haciendo. Así que explícitamente convierta el doble en int usando el siguiente código:
int total2= (int) price*much*0.7;
/*(int) tells compiler that you are aware of what you are doing.*/
//also called as type casting
En su caso, dado que está calculando el costo, le sugiero que declare la variable total2
como el tipo double o float.
double total2=price*much*0.7;
float total2=price*much*0.7;
//will work
Está intentando asignar un price* much* 0.7
, que es un valor de coma flotante (un double
), a una variable entera. Un double
no es un número entero exacto, por lo que, en general, una variable int
no puede contener un valor double
.
Por ejemplo, supongamos que el resultado de su cálculo es 12.6
. No puede contener 12.6
en una variable entera, pero podría descartar la fracción y solo almacenar 12
.
Si no te preocupa la fracción que perderás, envía tu número a una int
como esta:
int total2 = (int) (price* much* 0.7);
O podrías redondearlo al entero más cercano.
int total2 = (int) Math.round(price*much*0.7);