1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】Java JDK - doubleからintへの非可逆変換の可能性

2022-01-11 09:27:55

質問

次のようなJavaプログラムがあります。

    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;

解決方法は?

を変換すると double から int 値の精度は失われます。例えば、4.8657(double)をintに変換すると、intの値は4.Primitiveになります。 int は10進数を保存しないので、0.8657を失うことになります。

この場合、0.7はdouble値です(浮動小数点はfloat-0.7fと記述しない限り、デフォルトでdoubleとして扱われます)。計算するとき price*much*0.7 そのため、コンパイラはその答えを整数型に格納することを許可しません。 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