Java中的浮点转换

时间:2014-07-20 18:10:44

标签: java casting floating-point

对整数进行转换非常简单,额外的位只是消失了。

但是,重要的是要了解在铸造浮点的情况下发生了什么?我试图阅读有关如何计算浮点数的信息,但我还没有找到一个能够很好地解释浮点数的信息。至少那是我的借口。我得到了基本的想法,虽然尾数的计算有点困难。

至少在Java 7之前,我知道浮点不能用于按位运算。这是有道理的,因为它们是如何在内部存储的。有关浮点运算或投射的重要信息吗?

所以,总结一下:

了解整数浮点的内部工作原理是否很重要?

将浮点数转换为整数的内部过程是什么?

2 个答案:

答案 0 :(得分:1)

  

将浮点数转换为整数的内部过程是什么?

Java调用符合IEEE-754标准的机器代码指令。 Java没有什么可以做的。如果你想知道铸造是如何工作的,我建议你阅读标准。

基本上,尾数被指数移动并且应用了符号。即浮点数是符号* 2 ^指数*尾数,它所做的只是执行此计算和丢弃和小数部分。

答案 1 :(得分:0)

首先,您需要了解浮点数本质上是近似值。你可以输入1.23然后输出1.229998(或其他一些),因为1.23完全代表。无论你是否会进行任何演员表,你都需要理解这一点,以及它如何影响计算(尤其是比较)。

从强制转换的角度来看,将float转换为double会导致信息丢失,因为double可以包含float可以包含的每个值。但是从double转换为float会导致精度损失(对于非常大或小的数字,指数溢出/下溢),因为64位值中的信息比32中的更多。比特一,所以有些数据最终会“在场上”。

同样,从int投射到double不会导致信息丢失,因为double可以包含int可以包含的每个值,然后包含一些值。但是从int转换为float或从long转换为doublefloat会导致精度损失(尽管永远不会有指数溢出/下溢)。

floatdouble转换为intlong很容易导致上溢/下溢和重大数据丢失,如果float或{ {1}}值具有大的正指数或任何负指数。当然,当你从浮点数转换为固定数时,数字的小数部分会被截断(基本上是“地板”操作)。