【问题标题】:Double to int and double to int [duplicate]加倍到 int 和加倍到 int [重复]
【发布时间】:2019-11-07 07:13:05
【问题描述】:

我想知道在我的示例中 Double 反转为 int 时发生了什么?

这个案子是对的

Double d = 123.13;
int i = (int)(Math.random()*d);

这种情况是错误的

Double d = 123.13;
int i = (int)(d);

错误信息:Inconvertible types;cannot cast'java.lang.Double'to'int'

我知道我可以使用 d.intValue 来做到这一点,但我只是想知道上面两种情况有什么区别

【问题讨论】:

  • 将错误消息添加为文本而不是图像
  • Double 不能转换为int:因为int 不是Double 的子类型
  • Math.random()*d 的类型是 double,而不是 Double
  • @ernest_k double 也不是Double 的子类型。只是定义了转换。
  • int i = d.intValue()

标签: java casting int double


【解决方案1】:

包装类型只能转换为它包装的原始类型。

即您可以将Double 转换为double,但不能直接转换为int

第二个sn-p可以通过编译:

Double d = 123.13;
int i = (int)(double)(d);

在第一个 sn-p 中,您将一个原语(Math.random()*d 的类型为 double)强制转换为 int,这是允许的。

【讨论】:

  • 感谢您的回答,非常详细!
【解决方案2】:

你也可以像这样转换原始值:

Double d = 123.13;
int i = (int) d.doubleValue();

...这和Eran给出的答案几乎相同。

【讨论】:

  • 是的,或者int i = d.intValue();
  • 很好,非常感谢
【解决方案3】:

情况一:Double d = 123.13;int i = (int)(Math.random()*d);

情况2:Double d = 123.13;int i = (int)(d);

以上两种情况有什么区别?

在第一种情况下,Math.random() 返回一个double,而不是Double,所以这是正确的,因为double 可以转换为int(丢失小数部分)。

情况 2 是错误的,原因在 @Eran 的回答中进行了解释,包装器类型只能转换为它所包装的原始类型。 即您不能将 Double 转换为不可转换的原始类型 @ 987654328@

【讨论】:

  • 明白,谢谢
【解决方案4】:

发生了很多事情,请参阅JLS 5.1.7. Boxing Conversion

第二个是错误的,因为Double 是类而doubleprimitive data type

仅使用原始数据类型可以缩小范围

JLS 5.1.3. Narrowing Primitive Conversion

对原始类型的 22 种特定转换称为窄化原始转换:

字节或字符的缩写

字符转字节或短

int 转换为字节、short 或 char

long 到 byte、short、char 或 int

浮点到字节、short、char、int 或 long

double 转为字节、short、char、int、long 或 float

为了让您的代码正常工作,您可以像下面这样更改您的代码

double d = 123.13;
int i = (int)d;

【讨论】:

  • 好的,我明白你的意思了,我去看看拳击转换。谢谢你的回答!
猜你喜欢
  • 2016-01-02
  • 2012-03-10
  • 2013-05-19
  • 2014-01-31
  • 2012-09-14
  • 2016-05-13
  • 2012-09-20
  • 1970-01-01
  • 2012-05-17
相关资源
最近更新 更多