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

铸造到int的细节,从双精度和长精度

沈高峻
2023-03-14

嗨,我最近看到了一个类似这样的问题

int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE

在我回答了这个问题后,事实证明我弄错了,我回答了整数。MIN_VALUE但正确的答案是整数。MAX_VALUE。经过进一步的测试,我意识到我对大于整数的int施加的任何双精度。MAX_VALUE只是使int等于整数。MAX_VALUE。例如

int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE

经过进一步的测试,我意识到如果你试图将long转换为int,似乎会将int分配给一个看似随机的数字。

所以我的问题是。到底是怎么回事,为什么当您将双精度值转换为int时,它不会溢出整数?为什么将long转换为int会返回一个看似随机的数字

共有2个答案

傅玮
2023-03-14

对于将一个双精度值转换为整数,它将删除后面的点值,余数类似于将双精度值四舍五入,对于第一个问题,int将返回它可以保存在8位中的值,因此它似乎是最小值long a=Math。pow(2,32);将为您提供最大值,对于将long转换为整数,它不是随机数。这是长数字中最右边的32位对不起我写得不好英语是我的第二语言

咸弘雅
2023-03-14

这些转换的逻辑是Java语言规范第5.1.3项的一部分。

您可以看到,当从long转换为int时,最高有效位被丢弃,剩下最低有效位32位。

此外,如果四舍五入双精度或浮点数的结果是一个太小或太大而无法表示为int(或长)的数字,则将选择最小或最大可表示数字。

我们在这里无法回答很久以前作出的决定的“为什么”。但这就是语言的定义方式,您可以相信它在任何Java环境中都是一样的。

 类似资料:
  • 我很感激每一个暗示,关于转移目标的文件实现。我已经研究了一些关于浮动精度的论文,但在过去的两周里没有取得太大的进展。 提前感谢!

  • 问题内容: java中双值的乘法运算符的保证精度是多少? 例如,2.2 * 100是220.00000000000003,但是220是双精度数。220.00000000000003是220之后的下一个两倍。 问题答案: 乘法工作正常,但不能精确表示为双精度。最接近的双打是: 2.199999999999999733(0x4001999999999999) 2.200000000000000177(

  • 在64位jvm上,还是这样吗?由于这些值现在可以放入单个地址空间,这是否意味着这些类型现在存储在单个地址空间中? 如果需要在这些类型上使用volatile以确保每个单独的地址空间不会无序更新,那么这是否会对线程产生影响?

  • 我有一个关于dart中泛型的问题。我有下面的dart代码,带有扩展num的泛型类型参数。在我的类中,我现在想定义一个T类型的值为零的变量。这似乎是不可能的。有人能解释一下为什么会这样吗? 我面临的问题是,我想在我的类中创建一个用零初始化的列表。所以我可以做: 这适用于< code>A 类型'int'不是类型转换中类型'Double'的子类型 令人困惑的是,从Dart 2.1开始,可以将int传递给

  • 为什么此代码引发此异常: 线程“main”java.lang.ClassCastException:java.lang.Integer无法强制转换为java.lang.Double 而这个,运行良好: 两者都是尝试将整数转换为双精度,对吗?

  • 问题内容: 我想知道为什么会出现此错误。(这是Eclipse调试的显示日志) 我不明白为什么我没有得到2.97! 问题答案: 如果需要,您应该已经习惯了。 s以分数形式存储在 二进制 而不是十进制中。因此,例如,仅存储为。 并且不能精确地表示为二进制分数,因此会有一些舍入误差。 您可能还会发现本文很有帮助。