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

将int/long零转换为double

弘柏
2023-03-14

考虑此代码段:

int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;

在我的机器上运行这个会打印两个转换的0.0。但是d1d2只能是0.0吗?

据我所知,这是一个扩展的原语转换,规范中说:

拓宽的基元转换不会丢失有关数值的整体大小的信息。

以及

将int或long值加宽为float或将long值加宽为double可能会导致精度损失

据我所知,上述规范意味着int 0将始终成为double 0.0,但long 0可以转换为其他内容(例如1E-20或类似内容)。我的规格解释正确吗?

共有1个答案

吕自怡
2023-03-14

完整的报价是:

将int或long值扩大到float,或将long值扩大到double,可能会导致精度损失—也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入至最近模式。

(强调矿山)

这涵盖了int/long值不能在float/double中精确表示的情况(在这种情况下,选择最接近的可表示值)。显然,0是可以表示的,因此人们不会期望精度损失。

 类似资料:
  • 我正在解决一个问题,其中的任务是在用户提到的给定行输出pascal三角形的结果。 https://leetcode.com/problems/pascals-triangle-ii/ 我写了我的解决方案,其中有存储巨大阶乘结果的问题。 通过这些问题, 整数类型可以在C中存储哪些范围的值 长到无符号的字节数是多少? 并通过其他一些来源,我进行了以下更改,这给了我所需的结果。 由于“C”是int类型,

  • 所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var

  • 问题内容: 我一直在这里找到问题,并且Google的人们遇到了麻烦,而不是遇到了其他麻烦。但我敢肯定,我不是以前已经从去碰到这种情况的唯一一个到。 我发现的唯一其他答案是“首先将其设置为Long”,这实际上并没有解决这个问题。 我最初尝试投射,但得到了“ ” 如您所料,我有点困惑,我被困住了,因为有些内容以形式出现,而我要存储其信息的实体要求序列号为Long。 问题答案: 请注意,强制转换为和强制

  • 问题内容: Java中最惯用的方法是验证从转换long为int不会丢失任何信息? 这是我当前的实现: 问题答案: Java 8已添加了一个新方法来完成此任务。 会抛出一个溢出的情况。 看到: Java 8中已添加了其他几种溢出安全方法,它们的结尾是精确。 例子: Math.incrementExact(long) Math.subtractExact(long, long) Math.decrem

  • 问题内容: Java中的所有数字都应为int类型。以下行在Java> 1.5中是合法的 同样的机制去和实例。但是龙的作品完全不同。以下代码给出了编译时错误 Long对长类型使用自动装箱方法,因此 我看不到为什么不能将int赋给Long变量。关于这个问题有什么想法吗? 问题答案: 我认为问题不在于泛型转换原语和包装。问题是关于将int转换为java.lang.Long和将int转换为java.lan

  • 问题内容: 如何在Java中将值转换为值? 问题答案: 或如果您不必担心null: 在这两种情况下,您都可能会遇到溢出问题(因为Long可以比Integer存储更大的范围)。 Java 8有一个辅助方法来检查溢出(在这种情况下,您会得到一个异常):