[英]int and double divided by double java
我如何解释以下内容:
double o = 2.3;
int i = (int) (o * 100000.0);
double d = i / 100000.0;
System.out.println(d);
打印2.29999
double o = 2.3;
double i = o * 100000.0;
double d = i / 100000.0;
System.out.println(d);
版画2.3
当将int除以double时,java不会先将int转换为double,然后进行除法-如果这样,则两个代码块应有效地打印相同的值?
我似乎缺少一些IEEE 754浮点精度规范和/或内联的jvm优化
double i = 2.3 * 100000.0;
double d = i / 100000.0;
作为double d = 2.3 * 100000.0 / 100000.0; 有效地消除了分歧,使之成为无人值守。
有什么想法吗?
在IEEE-754 64位二进制浮点中不能完全表示2.3。 在您的第一个代码序列中发生的是:
2.3
转换为最接近的可表示值2.29999999999999989982236431605997495353221893310546875。 int
,转换将截断,并产生229999。 我似乎缺少一些IEEE 754浮点精度规范
使用(int)
,无论小数部分与下一个整数值有多接近,它都会截断小数部分。 由于信息丢失,它是不可逆的,因此获得相同的结果也就不足为奇了。
您可以做的是以下操作
double o = 2.3;
long l = Math.round(o * 100000.0);
double d = l / 100000.0;
System.out.println(d);
内联的jvm优化...使其成为无操作
JVM可能对其进行了优化,但不会改变结果。 如果优化改变了结果,那是优化器中的错误。
double i = o * 100000.0;
之后的i
值为229999.99999999997
(您可以通过添加一个简单的print语句来自己查看;这是由于浮点数不正确造成的 )。
int i = (int) (o * 100000.0);
之后的i
值为229999
(即,上面的值(小数部分由于int
而被截断))。
因此,在行中
double d = i / 100000.0;
您在两个摘要中使用了两个数值不同的i
值(即,它们相差约1),因此输出也不同。
您的说法正确,是将int除以double时,首先将int转换为double(这是通过字节码指令i2d
来完成的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.