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

将double强制转换为另一个数字类型

澹台成龙
2023-03-14

有一些东西让我困惑,我没有找到关于VM规范的太多信息。这有点晦涩,如果有人能给我解释一下就好了。

这几行代码......

double myTest = Double.MAX_VALUE;

System.out.println("1. float: " + (float)myTest);
System.out.println("2. int: " + (int)myTest);
System.out.println("3. short: " + (short)myTest);
System.out.println("4. byte: " + (byte)myTest);

..... 生成此输出:

  1. 浮动:无限
  2. int: 2147483647
  3. 短:-1
  4. 字节:-1

byteshortint是8位、16位和32位,带有两个补码floatdouble是32位和64位的IEEE 754(参见此处)。

根据我的理解,最大值的意味着尾数的所有位(52位)都切换到1。因此,转换为短或字节返回-1,即所有位都切换为1,这并不奇怪。它似乎保持'尾'的,使其适合8位字节或16位

令我惊讶的是对int的强制转换,以及在较小程度上对浮动的强制转换。如何可能得到"2. int: 2147483647"这是0x7FFFFFFF,最大值而短和字节3.和4.是-1?

浮动的强制转换也很奇怪。如果保留了myTest尾部的32位,那么它不应该生成一个NaN吗?

共有1个答案

卢知
2023-03-14

JLS在第5.1.3节中详细说明了缩小原始转换的规则。规则取决于目标类型。

float

从二进制到浮点的缩小基元转换受IEEE 754舍入规则(§4.2.4)管辖。这种转换可能会失去精度,但也会失去范围,导致非零倍数的浮点零和有限倍数的浮点无穷大。双NaN转换为浮点NaN,双无穷大转换为同符号浮点无穷大。

intlong

以下两种情况之一必须为真:

  • ...
  • 该值必须过大(大幅度或正无穷大的正值),第一步的结果是int或long类型的最大可表示值。

html" target="_blank">字节字符

如果目标类型为bytecharshort,则转换分两步进行。首先,如上所述,double被转换为long。然后,将long转换为最终类型,如下所示:

有符号整数到整数类型T的缩小转换简单地丢弃了除n个最低阶位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失关于数值大小的信息之外,这可能导致结果值的符号与输入值的符号不同。

 类似资料:
  • 我试图创建一个函数,如果x和y是整数,则返回x和y之间的随机整数,但如果x或y是双精度的,则该函数返回x和y之间的双精度。但当我尝试使用整数时,它引发了一个异常:“类java.lang.integer不能转换为类java.lang.double(java.lang.integer和java.lang.double位于加载程序“引导程序”的模块java.base中)”“如何修复它?

  • 问题内容: 当我尝试将double数组转换为Double arrayList时,出现以下错误: 线程“主”中的异常java.lang.ClassCastException:[无法将D强制转换为java.lang.Double 下面是我的代码。 我正在将此列表与另一个列表进行比较,并将结果分配给另一个double变量。 请让我知道此错误的原因。 问题答案: las,不适用于原语。Apache com

  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,

  • 问题内容: 我有2个不同的Java项目,其中一个有2个类:。 在另一个项目中,我动态加载这两个类并将它们存储在 Object 然后,我继续使用创建一个对象并将其存储在该对象上,然后我还将创建一个对象并将其添加到会话中。 在Form项目的生命周期中,我调用从会话中加载先前创建的bean对象(我​​正在运行)。当我尝试将此对象投射回A时,它失败,并显示。 当我使用以下方法将对象拉出会话时 并使用 检查

  • 问题内容: 从源(s,s,s)读取图像的最便捷方法是: 但是,然后, 如何转换为格式? 问题答案: 您可以创建所需类型的新BufferedImage,然后在其上绘制原始图像,如下所示: