繁体   English   中英

int和double除以double java

[英]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。
  • 将其乘以100000的确切数学结果也无法完全表示,因此将其舍入为229999.99999999997089616954326629638671875。
  • 将其转换为int ,转换将截断,并产生229999。
  • 再将其除以100000轮,产生2.29999000000000020094148567295633256435394287109375。
  • 打印以上内容时,Java将其显示为“ 2.29999”。

我似乎缺少一些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM