控制从double转换为float的转换规则是什么?

时间:2018-12-15 16:32:32

标签: java casting floating-point type-conversion narrowing

是否存在从double到float转换的幅度(十进制范围)? 一开始我是这么想的,但是指数级的部分让我感到困惑。 那么什么规则控制着转化

秒,从浮点数转换为整数时,规则就是取出 小数部分?意思是12.5 * 10 ^ -6的取值为零?

编辑:

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

  • 在Java中将double转换为float的二进制级别规则是什么 (即符号,尾数,变窄转换过程中的指数操作)

  • 这些二进制规则是否对应于十进制规则(人类可读),以便 根据源(双精度)值可以预测结果?

  • 将任一浮点型规则转换为 整数类型?

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,因为根据注释要求二进制工作:

通常请参见https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4

A)doublefloat

  

Java编程语言要求浮点运算的行为就像每个浮点运算符将其浮点结果四舍五入到结果精度一样。

因此,双精度四舍五入到下一个浮点数。转换可以描述如下:

  • 保持标志。
  • 将用作指数的signed int 11投射到signed int 8。如果这不可能,因为它会导致溢出,请返回Float.POSITIVE_INFINITYFloat.NEGATIVE_INFINITY
  • 并通过舍入舍弃尾数的最后29位。

结果,您已将double中的1 + 11 + 52位转换为float中的1 + 8 + 23位。

B)浮点到int

  

在将浮点值转换为整数(第5.1.3节)时,Java编程语言使用朝零取整的功能。在这种情况下,该行为就像数字被截断一样,丢弃了尾数位。

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

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

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

所有这些都可以手工完成,从而可以预测结果:是的,当然,否则这些定义将毫无用处。但这要求您使用要处理的数字的二进制表示形式,例如根据基数,“舍弃数字”会产生不同的结果。