3

第一種方式:這兩種將毫秒轉換爲秒的方式有什麼區別?

long mySeconds = milliseconds/ 1000; 

方式二:

double mySeconds = milliseconds * 1e-3d; 

此計算最終用於確定陣列的索引,例如:

int index = (int) ((someDoubleSeconds + mySeconds)/ someDouble); 

什麼差異將兩種方法使?

還有第一種方法rounds to the next second或截斷like floor function

+0

將double轉換爲int的規則是一個複雜的頭髮 - 我隱約記得可以有四捨五入。 (但請注意,它的問題確實與'(int)'投射命中了,而不是之前。) –

+0

但是第一個分割將截斷小數秒,而不是圓。 –

+1

@HotLicks將double轉換爲int只會簡化小數部分。 – arshajii

回答

1

正如其他人指出的,第一種方法截斷(在這種情況下有效地舍入),而第二種方式不會。因此,如果milliseconds是10999,那麼第一種方法可以讓你10,第二種方法讓你10.999

這在第三行有什麼不同?那麼,考慮是否someDoubleSeconds = 0someDouble = 10.5。那麼如果milliseconds是10999,那麼你的mySeconds可能是10或者可能是10.999,並且第三行的結果可能是0或者它可能是1.(因爲10/10.5小於1,並且會被截斷爲0強制轉換爲int,10.999/10.5大於1,並且會被轉換爲int而截斷爲1)

0

最前一頁一個是整數除法,這意味着,例如,如果你有

long mySeconds = 1234 

分裂後的1000,你會得到1

第二種方式將會給你一個準確的雙,我認爲你不想要。一秒半會適合你嗎?

第三種方法由於雙舍入爲整數而有點合併。請參閱Java郎規格:

一個浮點數爲整型T的縮小變換需要兩個步驟:

1)在第一步驟中,浮點數會被轉換成一如果T長,或者如果T是字節,短,字符或整型,如果T很長或者爲整數,如下所示:

。如果浮點數是NaN(§4.2.3),轉換的第一步的結果是一個int或長整數0.

。否則,如果浮點數不是無窮大,則使用IEEE 754 round-to-zero模式(第4.2.3節)將浮點值四捨五入爲整數值V.

然後有兩種情況:

。如果T很長,並且此整數值可以表示爲long,那麼第一步的結果是長整型值V.

。否則,如果此整數值可以表示爲int,則第一步的結果爲int值V.

。否則,以下兩種情況之一必須爲真:

。該值必須太小(負值大數量或負無窮大),第一步的結果是int或long類型的最小可表示值。

。該值必須太大(大數值或正無窮大的正數值),第一步的結果是int或long類型的最大可表示值。

2)第二步:

。如果T是int或long,則轉換的結果是第一步的結果。

。如果T是byte,char或short,則轉換結果是第一步結果的類型T(第5.1.3節)縮小轉換的結果。

BTW在Java標準庫中有一個很好的方法來轉換時間單位: java.util.concurrent.TimeUnit。

+0

沒有第三條路。 – user1071840