在java中将float和double转换为int时有什么区别?

hid*_*ame 4 java

我用这些语句来测试

float f=4.35f;
int i=(int)(f*100);
System.out.println(i);
double d=4.35;
i=(int)(d*100);
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

结果是

 435
 434
Run Code Online (Sandbox Code Playgroud)

我曾经认为float和double之间的唯一区别就在于精度.它们在计算中应该相同.但我将4.35转换为二进制,然后将其转换回十进制,发现它实际上是4.3499999 ......所以如果我将它乘以100然后再进行投射,我认为答案应该是434同时浮动和双重.为什么第一个是435?

Pas*_*uoq 6

Java中的浮点使用二进制表示.许多数字,在十进制具有短的精确表示,例如4.35,不具有在任何精度的二进制确切表示(可以是float,double或另一个).

4.35在Java程序中编写时,它被解释为double最接近的435/100.当你写作时4.35f,它被解释为float最近的435/100.

恰巧,这两个4.35和4.35f略低于100分之435:在Java中,4.35代表4.3499999999999996447286321199499070644378662109375准确和4.35f代表4.349999904632568359375.在第一个近似中,两种类型中最接近的可表示值低于目标435/100的可能性很大(尽管在深入研究它时,没有任何随机性).

数量435,另一方面可表示正是因为既float和double.

当乘以4.35f或4.35100(其是作为精确表示float和作为double太),两种可能性中的一种情况发生:

  • 乘法的数学结果比任何其他浮点数更接近435.然后435选择作为操作的结果.你必须记住,Java并不知道它正在乘以4.35的数字.据他所知,你故意选择低于4.35的数字.也许你真的打算将操作数设置为4.349999904632568359375.这是乘法过程中第二次近似的结果,最终结果是435.无论如何,转换浮点数435以int产生int 435.这就是在这种情况下发生的情况float.

  • 乘法的数学结果最接近435以下的浮点数.在这种情况下,选择该浮点数作为浮点乘法的结果.将此结果转换为int生成434,因为从浮点到整数的转换通过截断来工作.这就是在这种情况下发生的情况double.乘以4.3499999999999996447286321199499070644378662109375100会产生接近double下面的数学结果435.0(这double是434.99999999999994315658113919198513031005859375),因此将double其用作浮点乘法的结果.