Anda melakukan 157/32
yang membagi dua bilangan bulat satu sama lain, yang selalu menghasilkan bilangan bulat yang dibulatkan ke bawah. Oleh karena itu mereka (int) Math.ceil(...)
tidak melakukan apapun. Ada tiga kemungkinan solusi untuk mencapai apa yang Anda inginkan. Saya merekomendasikan menggunakan opsi 1 atau 2 . Harap JANGAN gunakan opsi 0 .
## Opsi 0
Ubah a
dan b
menjadi ganda, dan Anda dapat menggunakan pembagian dan Math.ceil
sesuai keinginan Anda. Namun saya sangat tidak menyarankan penggunaan pendekatan ini, karena pembagian ganda bisa jadi tidak tepat. Untuk membaca lebih lanjut tentang ketidaktepatan ganda, lihat pertanyaan ini .
int n = (int) Math.ceil((double) a / b));
##Pilihan 1
int n = a / b + ((a % b == 0) ? 0 : 1);
Anda lakukan a / b
dengan selalu lantai jika a
dan b
keduanya adalah bilangan bulat. Kemudian Anda memiliki seorang penyihir pernyataan-if inline memeriksa apakah Anda harus langit-langit dan bukan lantai. Jadi +1 atau +0, jika ada sisa pembagian Anda perlu +1. a % b == 0
periksa sisanya.
##Pilihan 2
Pilihan ini sangat singkat, tetapi mungkin untuk beberapa orang kurang intuitif. Saya pikir pendekatan yang kurang intuitif ini akan lebih cepat daripada pendekatan pembagian dan perbandingan ganda:
Harap dicatat bahwa ini tidak berhasil b < 0
.
int n = (a + b - 1) / b;
Untuk mengurangi kemungkinan meluap, Anda bisa menggunakan yang berikut ini. Namun harap dicatat bahwa ini tidak berfungsi untuk a = 0
dan b < 1
.
int n = (a - 1) / b + 1;
## Penjelasan di balik "pendekatan yang kurang intuitif"
Karena membagi dua integer di Java (dan sebagian besar bahasa pemrograman lainnya) akan selalu memberikan hasil. Begitu:
int a, b;
int result = a/b (is the same as floor(a/b) )
Tapi kami tidak mau floor(a/b)
, tapi ceil(a/b)
, dan menggunakan definisi dan plot dari Wikipedia :
Dengan fungsi plot lantai dan langit-langit ini Anda bisa melihat hubungannya.
Kamu bisa lihat itu floor(x) <= ceil(x)
. Kami membutuhkan floor(x + s) = ceil(x)
. Jadi kita perlu mencari s
. Jika kita mengambilnya 1/2 <= s < 1
akan benar (coba beberapa angka dan Anda akan melihatnya, saya merasa sulit untuk membuktikan ini). Dan 1/2 <= (b-1) / b < 1
, jadi
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
Ini bukan bukti nyata, tapi saya harap Anda puas dengannya. Jika seseorang dapat menjelaskannya dengan lebih baik, saya akan menghargainya juga. Mungkin menanyakannya di MathOverflow .
157/32 adalah
int/int
, yang menghasilkan fileint
.Coba gunakan literal ganda -
157/32d
, yaituint/double
, yang menghasilkan adouble
.sumber
157/32
adalah pembagian bilangan bulat karena semua literal numerik adalah bilangan bulat kecuali ditentukan lain dengan sufiks (d
untuk gandal
untuk panjang)pembagian dibulatkan ke bawah (menjadi 4) sebelum diubah menjadi dobel (4,0) yang kemudian dibulatkan (menjadi 4,0)
jika Anda menggunakan variabel, Anda dapat menghindarinya
sumber
sumber
Tidak ada yang menyebutkan yang paling intuitif:
Solusi ini memperbaiki ketidaktepatan divisi ganda .
sumber
Di Java, menambahkan .0 akan membuatnya menjadi ...
sumber
Saat membagi dua bilangan bulat, misalnya,
int c = (int) a / (int) b;
hasilnya adalah an
int
, nilai yanga
dibagi denganb
, dibulatkan menuju nol. Karena hasilnya sudah bulat,ceil()
tidak melakukan apa-apa. Perhatikan bahwa pembulatan ini tidak sama denganfloor()
, yang membulatkan ke arah negatif tak terhingga. Jadi,3/2
sama dengan1
(danfloor(1.5)
sama1.0
, tapi(-3)/2
sama-1
(tapifloor(-1.5)
sama-2.0
).Hal ini penting karena jika
a/b
selalu sama denganfloor(a / (double) b)
, maka Anda hanya bisa menerapkanceil()
daria/b
sebagai-( (-a) / b)
.Saran untuk mendapatkan
ceil(a/b)
dariint n = (a + b - 1) / b;
, yang setara dengana / b + (b - 1) / b
, atau(a - 1) / b + 1
bekerja karena
ceil(a/b)
selalu satu lebih besar darifloor(a/b)
, kecuali jikaa/b
bilangan bulat. Jadi, Anda ingin menggesernya ke (atau melewati) bilangan bulat berikutnya, kecualia/b
bilangan bulat. Menambahkan1 - 1 / b
akan melakukan ini. Untuk bilangan bulat, itu tidak akan cukup mendorong mereka ke bilangan bulat berikutnya. Untuk yang lainnya, itu akan terjadi.Astaga. Semoga masuk akal. Saya yakin ada cara yang lebih elegan secara matematis untuk menjelaskannya.
sumber
Juga untuk mengubah bilangan dari bilangan bulat menjadi bilangan real, Anda dapat menambahkan titik:
Dan hasil (157/32.) Juga akan menjadi nyata. ;)
sumber
sumber
Periksa solusi di bawah untuk pertanyaan Anda:
Di sini Anda harus mengalikan Pembilang dengan 1,0, maka itu akan memberikan jawaban Anda.
sumber
Gunakan ganda untuk melakukan cast seperti
Math.ceil((double)value)
atau sukasumber
Java hanya menyediakan pembagian lantai
/
secara default. Tapi kita bisa menulis langit-langit dengan istilah lantai . Ayo lihat:Semua bilangan bulat
y
dapat ditulis dengan formuliry == q*k+r
. Menurut definisi pembagian lantai (di sinifloor
) yang membulatkanr
,dan divisi langit-langit (di sini
ceil
) yang membulatkanr₁
,di mana kita dapat menggantikan
r+1
untukr₁
:Kemudian kami mengganti persamaan pertama menjadi persamaan ketiga untuk
q
mendapatkanAkhirnya, diberikan setiap bilangan bulat
y
di manay = q*k+r+1
untuk beberapaq
,k
,r
, kita memilikiDan kita selesai. Semoga ini membantu.
sumber
ceil
didefinisikan seperti itu dari definisi awal, khususnya di mana kita mengambil langit-langit dari sebuah integer, yaitu r1 = k. Karena kasus tepi adalah yang rumit tentang ini, saya pikir itu perlu dijelaskan lebih banyak.Ada dua metode untuk mengumpulkan nilai ganda Anda.
Jika Anda menginginkan jawaban Anda 4.90625 sebagai 4 maka Anda harus menggunakan Math.floor dan jika Anda menginginkan jawaban Anda 4.90625 sebagai 5 maka Anda dapat menggunakan Math.ceil
Anda dapat merujuk kode berikut untuk itu.
sumber
atau lebih umum
sumber