web-dev-qa-db-ja.com

Java JDK-doubleからintへの不可逆変換の可能性

だから私は最近次のコードを書いた:

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

ただし、これは表示され続けます。

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

Cmdで実行しようとすると。

誰かが私が犯したエラーを助けて説明できますか?どんな助けでも大歓迎です:)。ありがとう!

2
user5703472

doubleintに変換すると、値の精度が失われます。たとえば、4.8657(double)をintに変換すると、int値は4になります。Primitiveintは10進数を格納しないため、0.8657が失われます。

あなたの場合、0.7はdouble値です(float-0.7fとして言及されていない限り、浮動小数点はデフォルトでdoubleとして扱われます)。 price*much*0.7を計算する場合、答えはdouble値であるため、精度が低下する可能性があるため、コンパイラーは整数型に格納することを許可しません。これがpossible lossy conversionです。精度が低下する可能性があります。

それで、あなたはそれについて何ができますか?本当にやりたいことをコンパイラーに伝える必要があります。自分が何をしているのかを知っていることをコンパイラーに伝える必要があります。したがって、次のコードを使用して、doubleをintに明示的に変換します。

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

あなたの場合、コストを計算しているので、変数total2をdouble型またはfloat型として宣言することをお勧めします。

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

浮動小数点値(double)であるprice* much* 0.7を整数変数に割り当てようとしています。 doubleは正確な整数ではないため、一般にint変数はdouble値を保持できません。

たとえば、計算結果が12.6であるとします。整数変数に12.6を保持することはできませんが、分数を捨てて12を格納することはできます。

失う分数について心配していない場合は、次のように番号をintにキャストします。

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

または、最も近い整数に丸めることもできます。

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