Apakah saya salah melakukan modulus? Karena di jawa -13 % 64
seharusnya di evaluasi -13
tapi saya dapatkan 51
.
java
math
modulo
negative-number
Jakir00
sumber
sumber
%
adalah operator sisa.Jawaban:
Kedua definisi modulus bilangan negatif digunakan - beberapa bahasa menggunakan satu definisi dan beberapa bahasa lainnya.
Jika Anda ingin mendapatkan angka negatif untuk input negatif, Anda dapat menggunakan ini:
int r = x % n; if (r > 0 && x < 0) { r -= n; }
Demikian juga jika Anda menggunakan bahasa yang mengembalikan angka negatif pada masukan negatif dan Anda lebih suka positif:
int r = x % n; if (r < 0) { r += n; }
sumber
x % y
, A) jikax
negatif sisanya negatif, yaitux % y == -(-x % y)
. B) tanday
tidak berpengaruh yaitux % y == x % -y
Karena "secara matematis" keduanya benar:
-13 % 64 = -13 (on modulus 64) -13 % 64 = 51 (on modulus 64)
Salah satu opsi harus dipilih oleh pengembang bahasa Java dan mereka memilih:
Mengatakannya dalam spesifikasi Java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
sumber
-13 % 64 = 51
ketika saya mengharapkan-13
?".int result = (-5) % 3;
memberikan -2.int result = (-3) % 5;
memberikan -3. Secara umum,int result = (-a) % b;
memberikan jawaban yang benar saat | -a | > b. Untuk mendapatkan hasil yang tepat saat | -a | <b kita harus membungkus pembagi.int result = ((-a) % b) + b;
untuk negatif a atauint result = (((-a) % b) + b) % b;
untuk positif atau negatif aApakah Anda yakin Anda bekerja di Java? Karena Java memberikan -13% 64 = -13 seperti yang diharapkan. Tanda dividen!
sumber
Hasil Anda salah untuk Java. Berikan beberapa konteks bagaimana Anda sampai padanya (program Anda, implementasi dan versi Java).
Dari Spesifikasi Bahasa Java
Karena / dibulatkan menuju nol (menghasilkan nol), hasil% harus negatif dalam kasus ini.
sumber
int result = (-5) % 3;
memberi -2int result = (-3) % 5;
memberi -3 Secara umum,int result = (-a) % b;
memberikan jawaban yang benar jika | -a | > b Untuk mendapatkan hasil yang tepat saat | -a | <b kita harus membungkus pembagi.int result = ((-a) % b) + b;
untuk negatif a atauint result = (((-a) % b) + b) % b;
untuk positif atau negatif a.(-3) % 5
, hasil yang benar menurut definisi adalah-3
, dan implementasi Java yang benar akan menghasilkan hasil itu.(-3)%5
memang memberi-3
, dan jika kita menginginkan sisa positif kita harus menambahkan 5 padanya, dan kemudian hasilnya adalah2
kamu bisa memakai
(x % n) - (x < 0 ? n : 0);
sumber
((x % k) + k) % k
. (Meskipun milik Anda mungkin lebih mudah dibaca.)[0, sign(divisor) * divisor)
bukan[0, sign(dividend) * divisor)
.Jawaban Anda ada di wikipedia: operasi modulo
Dikatakan, bahwa di Jawa tanda operasi modulo sama dengan dividen. dan karena kita berbicara tentang operasi pembagian lainnya baik-baik saja, ia mengembalikan -13 dalam kasus Anda, karena -13/64 = 0. -13-0 = -13.
EDIT: Maaf, salah paham pertanyaan Anda ... Anda benar, java harus memberikan -13. Bisakah Anda memberikan lebih banyak kode sekitarnya?
sumber
Aritmatika modulo dengan operan negatif ditentukan oleh perancang bahasa, yang mungkin menyerahkannya pada implementasi bahasa, yang mungkin akan menunda definisi ke arsitektur CPU.
Saya tidak dapat menemukan definisi bahasa Java.Terima kasih Ishtar, Spesifikasi Bahasa Java untuk Operator Sisa% mengatakan bahwa tanda hasil sama dengan tanda pembilang.
sumber
Untuk mengatasinya, Anda dapat menambahkan
64
(atau apa pun basis modulus Anda) ke nilai negatif hingga bernilai positifint k = -13; int modbase = 64; while (k < 0) { k += modbase; } int result = k % modbase;
Hasilnya akan tetap berada di kelas kesetaraan yang sama.
sumber
x = x + m = x - m
dalam modulusm
.jadi
-13 = -13 + 64
di modulus64
dan-13 = 51
di modulus64
.asumsikan
Z = X * d + r
, jika0 < r < X
kemudian di divisiZ/X
kita sebutr
sisanya.Z % X
mengembalikan sisaZ/X
.sumber
Fungsi mod didefinisikan sebagai jumlah yang melebihi kelipatan bilangan bulat terbesar dari pembagi yang tidak lebih besar dari bilangan tersebut. Jadi dalam kasus Anda
-13 % 64
kelipatan bilangan bulat terbesar dari 64 yang tidak melebihi -13 adalah -64. Sekarang, jika Anda mengurangi -13 dari -64, hasilnya menjadi 51
-13 - (-64) = -13 + 64 = 51
sumber
Dalam versi saya Java JDK 1.8.0_05 -13% 64 = -13
Anda bisa mencoba -13- (int (-13/64)) dengan kata lain melakukan pembagian dilemparkan ke bilangan bulat untuk menghilangkan bagian pecahan kemudian mengurangi pembilang Jadi pembilang- (int (pembilang / penyebut)) harus memberikan yang benar sisa & tanda tangan
sumber
Di Java versi terbaru yang Anda dapatkan
-13%64 = -13
. Jawabannya akan selalu bertanda pembilang.sumber
Menurut bagian 15.17.3 dari JLS, "Operasi sisa untuk operand yang merupakan bilangan bulat setelah promosi numerik biner menghasilkan nilai hasil sehingga (a / b) * b + (a% b) sama dengan a. Identitas ini berlaku genap dalam kasus khusus bahwa pembagi adalah bilangan bulat negatif dari kemungkinan besar terbesar untuk tipenya dan pembaginya -1 (sisanya adalah 0). "
Semoga membantu.
sumber
Saya tidak berpikir Java mengembalikan 51 dalam kasus ini. Saya menjalankan Java 8 di Mac dan saya mendapatkan:
-13 % 64 = -13
Program:
public class Test { public static void main(String[] args) { int i = -13; int j = 64; System.out.println(i % j); } }
sumber