Javadoc resmi mengatakan bahwa Math.floor()
mengembalikan nilai double
yang "sama dengan bilangan bulat matematika", tetapi mengapa tidak mengembalikan nilai int
?
104
Javadoc resmi mengatakan bahwa Math.floor()
mengembalikan nilai double
yang "sama dengan bilangan bulat matematika", tetapi mengapa tidak mengembalikan nilai int
?
Menurut Javadoc yang sama:
Jika argumennya adalah NaN
atau tak terhingga atau nol positif atau nol negatif, maka hasilnya sama dengan argumen. Tidak bisa melakukan itu dengan int
.
Nilai terbesar double
juga lebih besar dari yang terbesar int
, jadi harus a long
.
Ini untuk ketepatan. Tipe data ganda memiliki mantissa 53 bit. Antara lain itu berarti bahwa dobel dapat mewakili semua keseluruhan hingga 2 ^ 53 tanpa kehilangan presisi.
Jika Anda menyimpan sejumlah besar dalam bilangan bulat, Anda akan mendapatkan luapan. Bilangan bulat hanya memiliki 32 bit.
Mengembalikan bilangan bulat sebagai dobel adalah hal yang benar untuk dilakukan di sini karena ia menawarkan rentang bilangan berguna yang jauh lebih luas daripada bilangan bulat.
sumber
Orang lain telah memberi tahu Anda alasannya, saya akan memberi tahu Anda cara membulatkan dengan benar mengingat Anda ingin melakukan ini. Jika Anda hanya akan menggunakan bilangan positif, maka Anda dapat menggunakan pernyataan ini:
Namun, (int) selalu membulatkan ke arah 0. Jadi, jika Anda ingin melakukan bilangan negatif:
Dalam kasus saya, saya tidak ingin melakukan ini. Saya menggunakan kode berikut untuk melakukan pembulatan, dan tampaknya menangani semua kasus edge dengan baik:
sumber
(int) Math.floor(a)
? Mungkin lebih efisien dan lebih pendek.(int) Math.floor(a)
Anda cukup menulis(int) a
, jika a positif.Apa yang Anda ingin kembalikan jika Anda memberikannya dua kali lipat lebih besar dari int atau panjang terbesar?
(Memang, jika lebih besar dari panjang terbesar, ketepatannya akan rendah - ini mungkin bukan bilangan bulat teoretis terdekat - tetapi meskipun demikian ...)
sumber
Sama seperti ada pembagian integer dan floating point di Jawa, ada cara integer dan floating point untuk melakukan floor:
atau
tetapi Anda harus selalu berhati-hati dalam menggunakan floor dengan aritmatika presisi hingga: perhitungan x Anda dapat menghasilkan sesuatu seperti 1,99999999 yang akan diturunkan ke 1, bukan 2 oleh kedua bentuk. Ada banyak algoritme di luar sana yang perlu mengatasi batasan ini untuk menghindari hasil yang salah untuk beberapa nilai masukan.
sumber
Sehingga kesalahan dan nilai bukan bilangan bulat lainnya dapat mengalir dengan benar melalui serangkaian perhitungan.
Misalnya, jika Anda memberi makan Not a Number (NaN) ke Math.floor, itu akan meneruskannya.
Jika mengembalikan bilangan bulat, ia tidak dapat meneruskan status atau kesalahan ini, dan Anda bisa mendapatkan hasil buruk dari penghitungan sebelumnya yang terlihat bagus tetapi salah setelah pemrosesan lebih lanjut.
sumber