Resmi Javadoc , bunun "matematiksel bir tam sayıya eşit olan" Math.floor()
a döndürdüğünü söylüyordouble
, ancak o zaman neden bir döndürmesin int
?
Yanıtlar:
Aynı Javadoc'a göre:
Bağımsız değişken NaN
veya sonsuz veya pozitif sıfır veya negatif sıfır ise, sonuç bağımsız değişkenle aynıdır. Bunu bir int
.
En büyük double
değer de en büyüğünden daha büyüktür int
, bu nedenle a olması gerekir long
.
Hassasiyet için. Çift veri türünün 53 bitlik mantisi vardır. Diğer şeylerin yanı sıra, bu, bir çiftin 2 ^ 53'e kadar olan her şeyi hassasiyet kaybı olmadan temsil edebileceği anlamına gelir.
Bu kadar büyük bir sayıyı bir tamsayı olarak saklarsanız, bir taşma elde edersiniz. Tam sayılar yalnızca 32 bit içerir.
Tamsayıyı çift olarak döndürmek burada yapılacak doğru şeydir çünkü bir tamsayıdan çok daha geniş bir yararlı sayı aralığı sunar.
Başkaları size nedenini söylediler, bunu yapmak istemeniz durumunda size nasıl doğru bir şekilde yuvarlanacağınızı anlatacağım. Yalnızca pozitif sayılar kullanacaksanız, bu ifadeyi kullanabilirsiniz:
int a=(int) 1.5;
Bununla birlikte, (int) her zaman 0'a yuvarlanır. Dolayısıyla, negatif bir sayı yapmak istiyorsanız:
int a=(int) -1.5; //Equal to -1
Benim durumumda bunu yapmak istemedim. Yuvarlamayı yapmak için aşağıdaki kodu kullandım ve tüm uç durumları iyi idare ediyor gibi görünüyor:
private static long floor(double a)
{
return (int) Math.floor(a);
}
(int) Math.floor(a)
? Muhtemelen daha verimli ve daha kısa.
(int) Math.floor(a)
basitçe yazabilirsin (int) a
, eğer a pozitifse.
Java'da bir tamsayı ve bir kayan nokta bölümü olduğu gibi, taban yapmanın tamsayı ve kayan noktalı yolları vardır:
double f = Math.floor(x);
veya
int k = (int) x;
ancak sonlu kesinlik aritmetiği ile floor kullanırken her zaman dikkatli olmanız gerekir: x'in hesaplanması, 1,99999999 gibi bir sonuç verebilir ve bu, her iki form tarafından 2 değil 1'e katlanacaktır. Bazı girdi değerleri için yanlış sonuçlar üretmekten kaçınmak için bu sınırlamayı aşması gereken birçok algoritma vardır.
Böylece bu hata ve diğer tamsayı olmayan değerler, bir dizi hesaplamayla doğru şekilde kademelendirilebilir.
Örneğin, Math.floor'a Bir Sayı Değil (NaN) beslerseniz, onu iletir.
Tamsayı döndürdüyse, bu durumu veya hataları geçemez ve daha önceki bir hesaplamadan iyi görünen ancak daha fazla işlemden sonra yanlış olan kötü sonuçlar alabilirsiniz.