2011-06-13 13 views
8

Aşağıdaki hesaplama neden negatif bir değer üretiyor?Java'da çarpma işlemi negatif sonuçlarla sonuçlanıyor

long interval = 0; 

interval = ((60000 * 60) * 24) * 30; 
+2

Hesaplamayı çeşitli adımlara ayırın ve hata ayıklayıcıda izleyin. Bu, yanlış gittiği yerleri daha açık bir şekilde göstermelidir. –

cevap

32

orada değerlendirilmektedir her ifade; int * int yerine long * long olarak (tabii ki, derleme zamanında bir sabittir). Sonuç bir noktada taşar. Yalnızca işlenen de uzun ürün bazıyapma birlikte kaçmak Tabii

interval = ((60000L * 60L) * 24L) * 30L; 

, ama sadece her şeyi değiştirmek daha kolaydır bulmak eğilimindedir: Yani sadece tüm işlenen değişmezleri uzun yapmak için L kullanın.

long interval = TimeUnit.DAYS.toMillis(30); 
2

Denklemin değeri o kadar büyük bir alana neden olduğu için etrafa sarılır Bir Tamsayı ile sonuçlanır. Int

3

bu deneyin, negatif olmayacak: Eğer "milisaniye 30 gün-değerinde" kullanmak daha iyi olurdu arıyorsanız

, tüm bu söyledikten sonra

long interval = 0; 

interval = ((60000L * 60L) * 24L) * 30L; 
+0

neden 'interval = 0;'? –

+0

@Prashant Bhate - sadece kopyalanmış OP'nin kodu :) 'aralık = 0;' hiç gerekli değil. – adarshr

2

Değeriniz, maksimum imzalanan tamsayı değeri 2^31'den (2147483648) büyük olan 2592000000'dür. Buna tamsayı taşması denir, sonuç negatif olarak taşar.