Jawaban:
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 file int
.
Coba gunakan literal ganda - 157/32d
, yaitu int/double
, yang menghasilkan a double
.
157/32
adalah pembagian bilangan bulat karena semua literal numerik adalah bilangan bulat kecuali ditentukan lain dengan sufiks ( d
untuk ganda l
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
double a1=157;
double a2=32;
int total = (int) Math.ceil(a1/a2);
Tidak ada yang menyebutkan yang paling intuitif:
int x = (int) Math.round(Math.ceil((double) 157 / 32));
Solusi ini memperbaiki ketidaktepatan divisi ganda .
Di Java, menambahkan .0 akan membuatnya menjadi ...
int total = (int) Math.ceil(157.0 / 32.0);
Saat membagi dua bilangan bulat, misalnya,
int c = (int) a / (int) b;
hasilnya adalah an int
, nilai yang a
dibagi dengan b
, dibulatkan menuju nol. Karena hasilnya sudah bulat, ceil()
tidak melakukan apa-apa. Perhatikan bahwa pembulatan ini tidak sama dengan floor()
, yang membulatkan ke arah negatif tak terhingga. Jadi, 3/2
sama dengan 1
(dan floor(1.5)
sama 1.0
, tapi (-3)/2
sama -1
(tapi floor(-1.5)
sama -2.0
).
Hal ini penting karena jika a/b
selalu sama dengan floor(a / (double) b)
, maka Anda hanya bisa menerapkan ceil()
dari a/b
sebagai -( (-a) / b)
.
Saran untuk mendapatkan ceil(a/b)
dari
int n = (a + b - 1) / b;
, yang setara dengan a / b + (b - 1) / b
, atau(a - 1) / b + 1
bekerja karena ceil(a/b)
selalu satu lebih besar dari floor(a/b)
, kecuali jika a/b
bilangan bulat. Jadi, Anda ingin menggesernya ke (atau melewati) bilangan bulat berikutnya, kecuali a/b
bilangan bulat. Menambahkan 1 - 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.
Juga untuk mengubah bilangan dari bilangan bulat menjadi bilangan real, Anda dapat menambahkan titik:
int total = (int) Math.ceil(157/32.);
Dan hasil (157/32.) Juga akan menjadi nyata. ;)
Periksa solusi di bawah untuk pertanyaan Anda:
int total = (int) Math.ceil(157/32);
Di sini Anda harus mengalikan Pembilang dengan 1,0, maka itu akan memberikan jawaban Anda.
int total = (int) Math.ceil(157*1.0/32);
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 formulir y == q*k+r
. Menurut definisi pembagian lantai (di sini floor
) yang membulatkan r
,
floor(q*k+r, k) == q , where 0 ≤ r ≤ k-1
dan divisi langit-langit (di sini ceil
) yang membulatkan r₁
,
ceil(q*k+r₁, k) == q+1 , where 1 ≤ r₁ ≤ k
di mana kita dapat menggantikan r+1
untuk r₁
:
ceil(q*k+r+1, k) == q+1 , where 0 ≤ r ≤ k-1
Kemudian kami mengganti persamaan pertama menjadi persamaan ketiga untuk q
mendapatkan
ceil(q*k+r+1, k) == floor(q*k+r, k) + 1 , where 0 ≤ r ≤ k-1
Akhirnya, diberikan setiap bilangan bulat y
di mana y = q*k+r+1
untuk beberapa q
, k
, r
, kita memiliki
ceil(y, k) == floor(y-1, k) + 1
Dan kita selesai. Semoga ini membantu.
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.
public class TestClass {
public static void main(String[] args) {
int floorValue = (int) Math.floor((double)157 / 32);
int ceilValue = (int) Math.ceil((double)157 / 32);
System.out.println("Floor: "+floorValue);
System.out.println("Ceil: "+ceilValue);
}
}
int total = (157-1)/32 + 1
atau lebih umum
(a-1)/b +1