好的,因为根据评论要求二进制工作:
一般参见https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4
A)double
至float
:
Java 编程语言要求浮点算术表现得好像每个浮点运算符都将其浮点结果四舍五入到结果精度。
所以双精度数舍入到下一个浮点数。转换可以描述如下:
- 保留标志。
- 将
signed int 11
used 作为指数转换为 a signed int 8
。如果这是不可能的,因为它会导致溢出,返回Float.POSITIVE_INFINITY
或Float.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)
所有这些都可以手工完成并因此预测结果吗:是的,当然,否则这些定义将毫无用处。但这需要您使用正在处理的数字的二进制表示,例如“丢弃数字”会根据基数创建不同的结果。