Java JDK – mogelijke conversie met verlies van double naar int

Dus ik heb onlangs de volgende code geschreven:

   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();
      }
}

Het blijft echter dit weergeven:

TrainTicket.java:31: error: incompatible types: possible lossy conversion from double to int
            int total2 = price* much* 0.7;

Als ik het probeer uit te voeren met cmd.

Kan iemand mij helpen en uitleggen welke fout ik heb gemaakt? Alle hulp wordt gewaardeerd :).
Bedankt!


Antwoord 1, autoriteit 100%

Als je doubleconverteert naar int, gaat de precisie van de waarde verloren.
Bijvoorbeeld,
Als je 4.8657 (dubbel) naar int converteert.De int-waarde is 4.Primitive intslaat geen decimale getallen op. Je verliest dus 0.8657.

In jouw geval is 0,7 een dubbele waarde (floating point wordt standaard als dubbel behandeld, tenzij vermeld als float-0.7f).
Wanneer u price*much*0.7berekent, is het antwoord een dubbele waarde en daarom staat de compiler u niet toe om het op te slaan in een type integer, omdat er een verlies aan precisie kan zijn. Dus dat is wat is possible lossy conversion, dan kan je precisie verliezen.

Dus wat zou je eraan kunnen doen?
Je moet de compiler vertellen dat je het echt wilt doen. Je moet hem vertellen dat je weet wat je doet.
Converteer dubbel dus expliciet naar int met behulp van de volgende code:

int total2= (int) price*much*0.7;
 /*(int) tells compiler that you are aware      of what you are doing.*/
 //also called as type casting

In jouw geval, aangezien je de kosten aan het berekenen bent, raad ik je aan om variabele total2als het type double of float te declareren.

double total2=price*much*0.7;
 float total2=price*much*0.7;
 //will work

Antwoord 2, autoriteit 27%

Je probeert price* much* 0.7, wat een drijvende-kommawaarde is (een double), toe te wijzen aan een integer-variabele. Een doubleis geen exact geheel getal, dus in het algemeen kan een int-variabele geen double-waarde bevatten.

Stel bijvoorbeeld dat het resultaat van uw berekening 12.6is. Je kunt 12.6niet in een integer-variabele houden, maar je kunt de breuk weggooien en gewoon 12opslaan.

Als je je geen zorgen maakt over de fractie die je verliest, cast je nummer als volgt naar een int:

int total2 = (int) (price* much* 0.7);

Of je kunt het afronden op het dichtstbijzijnde gehele getal.

int total2 = (int) Math.round(price*much*0.7);

Other episodes