[英]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.