我正在练习调试,并且有一个我不确定的问题,它会问什么是错的,我该怎么做才能修复它我读了它的书章但没有足够具体。从书中粘贴:
int a = 26.4 ^ 编译时,这是消息:
Test.Java:8:可能会失去精确度 int a = 26.4;
必需:int 发现:双倍 1错误
我对错误的原因有一个很好的理解,因为double的优先级高于int,以及int如何不能存储double值。
我的问题是,有没有办法将转换变量a输入到double类型?或者是通过将from int更改为double来解决此问题的唯一方法吗?
感谢
答案 0 :(得分:9)
您唯一的可能性是:
如果您想将您的号码存储为整数,请将double
输入int
:
int a = (int)26.4 // so a will be 26
(你显然会以这种方式失去精确度)
将号码存储为double
以保持精确度:
double a = 26.4
答案 1 :(得分:4)
投射无济于事,请看下面的代码:
//int a = 26.4; // gives compile error
int a = (int) 26.4; // gives 26
double b = a; // gives 26.0
double c = (double) a; // also gives 26.0
答案 2 :(得分:0)
我对错误的原因有一个很好的理解,因为double的优先级高于int,以及int如何不能存储double值。
虽然"优先"不是正确的术语,你似乎在某个基本层面上理解了这个问题。当您将double
投射到int
时,您可能会丢失信息。在这种情况下,26.4
将被截断为26
。
我的问题是,有没有办法将转换变量a输入到double类型?
类型转换将值的类型从一种类型更改为另一种类型。您无法使用类型转换来更改变量的类型。将a
声明为int
后,它始终为int
。你不能改变它。但是,a
中存储的值可以在表达式中使用时转换为其他类型。
答案 3 :(得分:0)
有几种方法可以解决这个问题,哪种方法正确取决于应用程序。
第一个将左手类型保持为int
,并将右侧投射到int
:
int a = (int) 26.4;
如果向零舍入,并且将值限制在Integer.MIN_VALUE
和Integer.MAX_VALUE
范围内,则适用于您的应用程序,这是正确的。
接下来,您可以将左侧的类型更改为double
。
double a = 26.4;
如果可以使用a
执行使用double
的进一步操作,那么这是正确的。如果您必须具有int
值,例如,为了传递给需要int
的某个API,或者指定数组的长度或索引,这将不起作用。
或者,您可能需要使用Math
API明确控制舍入和范围检查。例如,要舍入到 nearest 整数,如果int
的值太大,则抛出异常:
int a = Math.toIntExact(Math.round(26.4));
答案 4 :(得分:0)
我认为以下代码可能会对您有所帮助。 在下面的代码中,它将double转换为整数变量,尽管对于这么简单的事情来说这是一个有点乏味的过程。
double a=26.4;
int b =(int)Math.round(a);