2016-01-31 85 views
2

我試圖把當前系統時間,瞭解Java變量/小數

long now = System.currentTimeMillis(); 

找出遠光是如何自1970年以來走過(公里),

double km = (now/1000.0) * 299792.458; 

和打印值。

System.out.printf("Since the unix Epoch, light has traveled...\n%f km", km); 

但是當我運行代碼時,我只能得到兩位小數的答案。

435963358497001.750000 km 

這是有原因嗎?打印使用

System.out.println(km); 

值給我

4.3596335849700175E14 

看到有有意義的,爲什麼它切斷對E。有沒有辦法讓我的價值達到3位或更多的小數位?

+1

'DecimalFormat'。 – Satya

+2

爲什麼不使用'km = now * 299.792458;'而不是'km =(now/1000.0)* 299792.458;'? –

+0

@LưuVĩnhPhúc在[我的答案](http://stackoverflow.com/a/35111025/5221149)中使用了您的建議。幫助簡化代碼。謝謝。 – Andreas

回答

4

您已超出的double(15到17個十進制數字)的precision,所以結果是圓形的。

嘗試使用BigDecimal代替:

long now = 1454217232166L; // Sun Jan 31 00:13:52 EST 2016 
BigDecimal km = BigDecimal.valueOf(now).multiply(BigDecimal.valueOf(299.792458)); 
System.out.println(km); // prints: 435963358497001.804028 
+1

這給出了更多的小數位數,但由於光速僅由9位有效數字給出,因此只有結果的前9位數字纔是相關的。 – Henry

+2

@Henry 9位數字是確切的[光速](https://en.wikipedia.org/wiki/Speed_of_light):*「它的**精確值是每秒299792458米**(約3.00×10⁸米/ s),因爲儀表的長度是根據這個常數和國際標準的時間來定義的。「*沒有舍入,所以用16位以上的精度計算是有效的。 – Andreas

+0

是的你是對的,它適用於這種情況。儘管如此,我仍然會留下我的評論,作爲警告,對於其他物理常數,在結果中輸入大量數字可能沒有意義。 – Henry

0

只要格式化它到三個地方,試試這個。

System.out.printf("Since the unix Epoch, light has traveled...\n%.3f km", km); 
+0

這有幫助,但它不能解決我的問題。我得到三位小數,但最後一位始終爲0. – clownfishhuman