2011-09-02 18 views
64

Math.ceil(5.2) numaralı telefonu aradığımda, double6.0 dönüşüdür. Benim doğal eğilimim Math.ceil(double a)'un long döndüreceğini düşünmekti.Math.ceil neden bir çift döndürüyor?

ceil(double a)

argüman daha az olmayan ve matematiksel tam sayıya eşit olan en küçük (negatif sonsuza yakın) double değeri İade belgelerine.

Ama neden bir double ziyade sonuç bir tamsayı olduğunda long bir daha dönmek? Bunun sebebini anlamak, Java'yı biraz daha iyi anlamama yardımcı olabilir. Aynı zamanda, long, mesela bir long adresine göndererek sorun yaşayacağımı anlamaya da yardımcı olabilir. Ben olması gereken ne düşündüğünü hep

long b = (long)Math.ceil(a);

mı? Korkarım ki sorunlu bazı sınır durumları olabilir.

+0

Bkz. Http://stackoverflow.com/questions/3412449/why-does-math-round-return-a-long-but-math-floor-return-a-double – starblue

cevap

61

double aralığı long'dan daha büyüktür. Örneğin: Math.ceillong döndü eğer son satır yapmak için beklediğiniz ne

double x = Long.MAX_VALUE; 
x = x * 1000; 
x = Math.ceil(x); 

?

Çok büyük değerlerde (pozitif veya negatif) sayılar çok seyrek olarak dağıtıldıklarına dikkat edin; yani tamsayı x'dan büyük sonraki tamsayı, ne demek istediğimi görürseniz x + 1 olmayacaktır.

+0

Son cümleninizde sanırım hassas bir gevşeklikten bahsediyorum ama bunun yüksek sayıya bağlı olmadığını düşünüyorum, ancak rakamın önemli sayıdaki sayısı (ikili olarak). Bir örnek bulmaya çalışacağım. – aalku

+0

@ user270349: Ardışık çifte değerler arasındaki mutlak aralık, değer büyüdükçe büyür. Temsil edilen anlamlı basamakların sayısı aynı kalır (normal olmayan sayılar haricinde). –

+2

Örnek: '2^60' çift olarak gösterilebilirken' 2^60 (+/-) 1', – aalku

13

Bir çift, Long.MAX_VALUE'dan daha büyük olabilir. Böyle bir değerde Math.ceil() numaralı telefonu ararsanız, aynı değeri döndürmeyi beklersiniz. Ancak uzun bir süre geri döndüyse, değer yanlış olur.

+0

"long.MAX_VALUE" değerinden daha büyük olan "double" değerleri tam olarak gösterilmeyebilir, bu nedenle de 'double' sonucu ceil (big_double) '' big_double + 1' olacaktır. Yani hala yanlış ... –

+0

@CiprianTomoiaga bu big_double olurdu gibi big_double +1 olmayacak doğru. 'Long' olarak temsil edilemeyecek kadar büyük olan herhangi bir değerin kesirli kısmı yoktur. –

İlgili konular