当前位置: 首页 > 知识库问答 >
问题:

JavaJDK-从Double到int的可能有损转换

郭恩
2023-03-14

所以我最近写了以下代码:

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

当我尝试使用cmd运行它时,它一直显示以下内容:

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

有人能帮我解释一下我犯的错误吗?

共有2个答案

禹昆
2023-03-14

您试图将price*multy*0.7赋值给一个整数变量,它是一个浮点值(一个双精度double不是一个精确的整数,因此通常intvariable不能保存0.05的double值。

例如,假设您的计算结果是< code>12.6。您不能将< code>12.6保存在整数变量中,但是您可以丢弃分数,只存储< code>12。

如果您不担心会损失的分数,请将您的数字转换为int,如下所示:

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

或者你可以把它四舍五入到最接近的整数。

int total2 = (int) Math.round(price*much*0.7);
桓喜
2023-03-14

double转换为int时,值的精度会丢失。例如,当您将4.8657(double)转换为int时,int值将为4。Primitiveint不存储十进制数,因此您将丢失0.8657。

在您的例子中,0.7是双精度值(浮点数默认被视为双精度值,除非称为浮点数 - 0.7f)。当您计算 price*much*0.7 时,答案是双精度值,因此编译器不允许您将其存储在整数类型中,因为可能会损失精度。这就是“可能的有损转换”,您可能会失去精度。

那么你能做些什么呢?你需要告诉编译器你真的想这么做。你需要告诉它你知道你在做什么。所以使用以下代码显式地将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

在您的例子中,由于您正在计算成本,我建议您将变量< code>total2声明为double或float类型。

double total2=price*much*0.7;
 float total2=price*much*0.7;
 //will work
 类似资料:
  • 问题内容: 所以我最近写了下面的代码: 但是,它一直显示: 当我尝试使用cmd运行它时。 有人可以帮助并解释我所犯的错误吗?任何帮助表示赞赏:)。谢谢! 问题答案: 当您转换到,值的精度损失。例如,当您将4.8657(double)转换为int时,int值将为4.Primitive 不存储十进制数字,因此您将丢失0.8657。 在您的情况下,0.7是一个双精度值(除非提到float-0.7f,否则

  • 目前,我正在使用链表,但是我有一个代码问题。下面的代码运行正常,但是当我试图用a添加一些节点来生成随机数时,它给了我这个错误。在为代码添加之前,运行添加,现在您可以在main中看到。也许我错过了什么。有人能帮我理解一下吗? 附言:评论部分是我试图“升级”的主要部分。

  • 问题内容: 我已经定义了数组gx,数组arr为短型。但是为什么左边的运算可能会以int类型结束,而我必须将其转换为short?编译器错误可能是从int到short的有损转换。 这是我的代码。 } 那是因为所谓的拆箱吗?因此,这意味着我每次进行手术时都需要进行投射吗? 问题答案: 它不是开箱;这是“二进制数值提升”。 JLS的第5.6.2节规定: 当运算符将二进制数字提升应用于一对操作数时,每个操作

  • 我试图用java将十六进制数据写入我的串口,但是现在我不能将十六进制数据转换成字节数组。 以下是显示错误消息的代码: 这是写入串行端口的代码: 我能知道如何解决这个问题吗?目前我正在使用javax.comm插件。谢谢。

  • 地点:课堂歌词 错误:不兼容类型:从double到int的转换可能有损 2个错误

  • 我希望输入一个和另一个ex: 1和1000000000,现在我希望创建一个大小为1000000000的数组。然后在数组的每个索引处,存储int val,ex:。 当我尝试执行此操作时,Netbeans 会向我显示此行中的错误: “可能从long到int的有损转换”。这是我的密码:-