簡體   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