Menurut Google Kalkulator (-13) % 64
adalah 51
.
Menurut Javascript (lihat JSBin ini ) itu -13
.
Bagaimana cara saya memperbaikinya?
javascript
math
modulo
Alec Gorge
sumber
sumber
(-13) % 64
atau-(13 % 64)
? Secara pribadi, saya akan memasukkan parens baik, hanya untuk kejelasan ekstra.%
bukan operator modulo. Ini operator sisanya. Tidak ada operator modulo di JavaScript. Jadi jawaban yang diterima adalah jalan yang harus ditempuh.Jawaban:
Diambil dari artikel ini: Bug JavaScript Modulo
sumber
x < -n
- misalnya(-7 + 5) % 5 === -2
tetapi((-7 % 5) + 5) % 5 == 3
.Menggunakan
Number.prototype
SLOW, karena setiap kali Anda menggunakan metode prototipe nomor Anda dibungkus denganObject
. Alih-alih ini:Menggunakan:
Lihat: http://jsperf.com/negative-modulo/2
~ 97% lebih cepat daripada menggunakan prototipe. Jika kinerja sangat penting bagi Anda tentu saja ..
sumber
n
danm
s sekitar dengan cara yang salah dalam contoh @StuR kedua Anda. Seharusnya begitureturn ((n % m) + m) % m;
.The
%
operator dalam JavaScript adalah operator sisa, bukan operator modulo (perbedaan utama adalah bagaimana angka negatif diperlakukan):-1 % 8 // -1, not 7
sumber
remainder
, itu harus lebih besar dari 0 menurut definisi. Tidak bisakah kau ingat teorema pembagian dari sekolah tinggi ?! Jadi mungkin Anda bisa melihatnya di sini: en.wikipedia.org/wiki/Euclidean_divisionFungsi "mod" untuk mengembalikan hasil positif.
Dan tentu saja
sumber
#sec-applying-the-mod-operator
di url :) Pokoknya, terima kasih atas catatannya, saya mengambil jawaban saya, itu tidak terlalu penting.Jawaban yang diterima membuat saya sedikit gugup karena menggunakan kembali% operator. Bagaimana jika Javascript mengubah perilaku di masa depan?
Berikut ini solusinya yang tidak menggunakan kembali%:
sumber
-
,*
,/
,;
,.
,(
,)
,,
,Math.floor
,function
ataureturn
perubahan? Kemudian kode Anda rusak parah.Meskipun tidak berperilaku seperti yang Anda harapkan, itu tidak berarti bahwa JavaScript tidak 'berperilaku'. Ini adalah pilihan JavaScript yang dibuat untuk perhitungan modulo-nya. Karena, menurut definisi, kedua jawaban itu masuk akal.
Lihat ini dari Wikipedia. Anda dapat melihat di sebelah kanan bagaimana berbagai bahasa memilih tanda hasil.
sumber
Jika
x
bilangan bulat dann
merupakan kekuatan 2, Anda dapat menggunakanx & (n - 1)
sebagai gantinyax % n
.sumber
Jadi sepertinya jika Anda mencoba mod sekitar derajat (sehingga jika Anda memiliki -50 derajat - 200 derajat), Anda ingin menggunakan sesuatu seperti:
sumber
Saya berurusan dengan negatif dan negatif juga
sumber
Ini bukan bug, ada 3 fungsi untuk menghitung modulo, Anda dapat menggunakan yang sesuai dengan kebutuhan Anda (saya akan merekomendasikan untuk menggunakan fungsi Euclidean)
Memotong fungsi bagian desimal
Fungsi bagian integer
Fungsi Euclidean
sumber
%
dapat mengembalikan hasil negatif (dan ini adalah tujuan dari fungsi-fungsi ini, untuk memperbaikinya)parseInt(-41).mod(-7)
akan kembali-6
sebagai gantinya1
(dan inilah tepatnya tujuan fungsi bagian Integer yang saya tulis)Ada paket NPM yang akan melakukan pekerjaan untuk Anda. Anda dapat menginstalnya dengan perintah berikut.
npm install just-modulo --save
Penggunaan disalin dari README
Repositori GitHub dapat ditemukan melalui tautan berikut:
https://github.com/angus-c/just/tree/master/packages/number-modulo
sumber