【问题标题】:Why can I pass a float to the constructor of Double?为什么我可以将浮点数传递给 Double 的构造函数?
【发布时间】:2018-06-27 00:45:30
【问题描述】:

在下面的代码中,我从doublefloatString 构造了一些Double 变量。但是,根据文档,Double 只有接受doubleString 的构造函数,而不是float。那么这段代码是如何编译的呢?

Double d1 = new Double(2.5);
Double d2 = new Double(2.5f); //Why can I pass a float here?
Double d3 = new Double("2.5");

【问题讨论】:

  • 双倍浮点数是什么意思?那个代码在哪里?在这里你只做双打
  • 你可以看到我在 Double d2=new Double(2.5f); 中将浮点值解析为 Double 构造函数;行
  • 为什么你使用new Double?您几乎不应该将new 与包装类一起使用。
  • 我的评论是指“我​​尝试将双精度值传递给浮点数,但它不起作用”...该代码不在这里
  • FWIW, Double.parseDouble 应该用在字符串上

标签: java floating-point double


【解决方案1】:

因为float 通常可以在不损失精度的情况下转换为double,所以float 可以自动加宽double。有关 Java 将自动扩展哪些类型的信息,请参阅Widening Primitive Conversion

链接文档中提到了关于float/double转换的异常:

floatdouble 的扩展原始转换不是 strictfp 可能会丢失有关 换算值。

【讨论】:

  • 失去精度是什么意思
  • @ThilanRavindu 您需要阅读有关浮点数如何工作的教程。
  • @ThilanRavindu 失去精度意味着失去一部分实际价值。比如,(int)2.5f 在这里你会损失 0.5
【解决方案2】:

有两种类型的转换,加宽转换(隐式)和窄化转换(显式完成)

加宽 --> 将较小的范围转换为较大的范围

Narrowing --> 将更大的范围转换为更低的范围(这会导致数据丢失)

所以float可以被类型转换成Double,找到图片化视图

【讨论】:

  • 术语是“扩大转换”(可以是隐式的)与“缩小转换”(必须有明确的转换)。问题是缩小转换会导致“信息丢失”——数字越小精度越低。
  • 请注意,一些扩大的转换(例如,在最坏的情况下,将long 转换为float)也可能导致信息丢失。它们只是被隐式允许。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多