首页 > 解决方案 > 从 double 到 float 的 Narrowing 转换的管理规则是什么?

问题描述

从 double 到 float 的转换是否基于大小(十进制范围)?一开始我是这么想的,但是指数部分让我很困惑..那么什么规则控制着这种转换

其次,当从浮点数转换为整数时,规则是否只是取出小数部分?意思是 12.5 * 10^-6 将评估为零?

编辑:

我将以另一种更精确的形式写出我的问题:

谢谢

标签: javacastingfloating-pointtype-conversionnarrowing

解决方案


好的,因为根据评论要求二进制工作:

一般参见https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4

A)doublefloat

Java 编程语言要求浮点算术表现得好像每个浮点运算符都将其浮点结果四舍五入到结果精度。

所以双精度数舍入到下一个浮点数。转换可以描述如下:

  • 保留标志。
  • signed int 11used 作为指数转换为 a signed int 8。如果这是不可能的,因为它会导致溢出,返回Float.POSITIVE_INFINITYFloat.NEGATIVE_INFINITY
  • 并通过舍入丢弃尾数的最后 29 位。

结果,您已将双精度的 1+11+52 位转换为浮点数的 1+8+23 位。

B)浮点到int

Java 编程语言在将浮点值转换为整数(第 5.1.3 节)时使用向零舍入,在这种情况下,它的作用就像数字被截断一样,丢弃尾数位。

所以简单来说:写下数字(不是科学记数法)并删除超出的所有内容.

在 PC 中,它可能通过将尾数指数位向适当的方向移动,然后丢弃(而不是舍入!)任何剩余的小数来工作。最后将结果乘以-1浮点数是否为负。简而言之:

 int = float.mantissa << float.exponent * (float < 0 ? -1 : 1)

所有这些都可以手工完成并因此预测结果吗:是的,当然,否则这些定义将毫无用处。但这需要您使用正在处理的数字的二进制表示,例如“丢弃数字”会根据基数创建不同的结果。


推荐阅读