Cijelo razdvajanje s ostatkom u javascriptu?

Kako se dobiva u javascriptu:

  • je cijeli broj nakon što je dani cijeli broj otišao drugom?
  • ravnotežu?
616
19 нояб. postavila Yarin 19. studenog 2010-11-19 21:53 '10 u 21:53 2010-11-19 21:53
@ 14 odgovora

Za neki broj y i neki djelitelj x izračunajte koeficijent ( quotient ) i ostatak ( remainder ) kao:

 var quotient = Math.floor(y/x); var remainder = y % x; 
817
19 нояб. Odgovor daje Mark Elliot 19. studenog 2010-11-19 21:55 '10 u 21:55 2010-11-19 21:55

Ne razumijem bitni operatori, ali evo još jednog načina da dobijemo cijeli broj:

 var num = ~~(a / b); 

To će raditi dobro za negativne brojeve, a Math.floor() u pogrešnom smjeru.

border=0

To se također čini ispravnim:

 var num = (a / b) >> 0; 
273
19 нояб. odgovor od korisnika113716 19. studenog. 2010-11-19 22:14 '10 u 22:14 2010-11-19 22:14

Napravio sam neke testove brzine u Firefoxu.

 -100/3 // -33.33..., 0.3663 millisec Math.floor(-100/3) // -34, 0.5016 millisec ~~(-100/3) // -33, 0.3619 millisec (-100/3>>0) // -33, 0.3632 millisec (-100/3|0) // -33, 0.3856 millisec (-100-(-100%3))/3 // -33, 0.3591 millisec  a/b // -33.33..., 0.4863 millisec Math.floor(a/b) // -34, 0.6019 millisec ~~(a/b) // -33, 0.5148 millisec (a/b>>0) // -33, 0.5048 millisec (a/b|0) // -33, 0.5078 millisec (a-(a%b))/b // -33, 0.6649 millisec 

Navedeno se temelji na 10 milijuna uzoraka za svaki.

Zaključak: Koristite (a/b>>0) (ili (~~(a/b)) ili (a/b|0) ) kako biste postigli učinkovitost od 20%. Također imajte na umu da svi ne odgovaraju Math.floor , kada a/b<0 a%b!=0 .

125
20 июня '13 в 18:42 2013-06-20 18:42 odgovor je dat KalEl 20. lipnja '13 u 18:42 2013-06-20 18:42

ES6 uvodi novu metodu Math.trunc . To vam omogućuje da ispravite @MarkElliot odgovor tako da radi i za negativne brojeve:

 var div = Math.trunc(y/x); var rem = y % x; 

Primijetite da Math metode imaju prednost pred bitovnim operatorima, da rade s brojevima većim od 2 31 .

76
10 марта '14 в 20:30 2014-03-10 20:30 odgovor je dao Oriol 10. ožujka 2014. u 20:30 sati 2014-03-10 20:30
 var remainder = x % y; return (x - remainder) / y; 
19
14 февр. odgovor je dao gammax 14. veljače. 2013-02-14 09:48 '13 u 9:48 2013-02-14 09:48

Možete koristiti funkciju parseInt da biste dobili odrezani rezultat.

 parseInt(a/b) 

Da biste dobili ostatak, koristite mod operatora:

 a%b 

parseInt ima neke zamke s nizovima kako bi se izbjeglo korištenje radix parametra s bazom od 10

 parseInt("09", 10) 

U nekim slučajevima, nizni prikaz broja može biti znanstveni zapis, u kojem slučaju parseInt će dovesti do netočnog rezultata.

 parseInt(100000000000000000000000000000000, 10) // 1e+32 

Ovaj poziv će rezultirati s 1.

10
13 апр. Odgovor dao Édipo Costa Rebouças 13. travnja 2015-04-13 20:17 '15 u 20:17 2015-04-13 20:17

JavaScript na desnoj strani izračunava spol negativnih brojeva i ostatak ne-brojeva, slijedeći matematičke definicije za njih.

FLOOR je definiran kao "najveći cijeli broj manji od parametra", dakle:

  • pozitivni brojevi: FLOOR (X) = cijeli dio X;
  • negativni brojevi: FLOOR (X) = cijeli dio X minus 1 (jer bi trebao biti manji od parametra, tj. više negativan!)

REMAINDER se definira kao "lijeva" podjela (euklidska aritmetika). Kada dividenda nije cijeli broj, faktor obično nije cijeli broj, tj. Nema ostatka, ali ako je kvocijent prisiljen biti cijeli broj (a što se događa kada netko pokuša dobiti ostatak ili broj s pomičnim zarezom), ne-cijeli broj će očito ostati.

JavaScript izračunava sve kako je očekivano, tako da programer mora biti oprezan da postavlja prava pitanja (i ljudi moraju biti oprezni da odgovore ono što je postavljeno!) Yarinovo prvo pitanje NIJE bilo "što je cjelobrojna podjela X na Y", ali umjesto toga, "CIJELI broj puta dani cijeli broj GOES INTO drugog". Za pozitivne brojeve, odgovor je isti za oba, ali ne i za negativne brojeve, jer će cijela podjela (dividenda dividende) biti -1 manja od broja (djelitelja) "ide na drugu" (dividenda). Drugim riječima, FLOOR će vratiti točan odgovor za cjelobrojnu podjelu negativnog broja, ali Yarin o tome nije pitao!

gammax je ispravno odgovorio, ovaj kod radi prema uputama Yarina. S druge strane, Samuel je pogriješio, nije se bavio matematikom, mislim, ili bi vidio da to stvarno djeluje (također nije rekao da je on dijelio njegov primjer, ali se nadam da je 3):

Stanje = X% Y = -100% 3 = -1

GoesInto = (X - preostalo) / Y = (-100 - -1) / 3 = -99/3 = -33

Usput, testirao sam kod na Firefoxu 27.0.1, radio je kako se očekivalo, s pozitivnim i negativnim brojevima, kao i s ne-cjelobrojnim vrijednostima, kako za dividende tako i za dijelove. primjer:

-100,34 / 3,57: GoesInto = -28, ostatak = -0,3800000000000079

Da, primijetio sam da postoji problem točnosti, ali nisam imao vremena da ga provjerim (ne znam postoji li problem s Firefoxom, Windowsom 7 ili mojim FPU procesorom). Međutim, za pitanje Yarin, koji uključuje samo cijele brojeve, gammax kôd radi dobro.

4
27 февр. odgovor daje Cyberknight 27. veljače. 2014-02-27 22:23 '14 u 10:23 2014-02-27 22:23

Math.floor(operation) vraća zaokruženu vrijednost operacije.

Primjer 1. pitanja:

 var x = 5; var y = 10.4; var z = Math.floor(x + y); console.log(z); 

konzola:

15

Uzorak pitanja 2.

 var x = 14; var y = 5; var z = Math.floor(x%y); console.log(x); 

konzola:

4

4
01 нояб. Odgovor je dat struji 01. studenog. 2014-11-01 03:22 '14 u 3:22 2014-11-01 03:22

Alex Moore-Niemi komentira kao odgovor:

Za rubiste ovdje iz google u divmod pretraživanje možete ga implementirati kao takve:

 function divmod(x, y) { var div = Math.trunc(x/y); var rem = x % y; return [div, rem]; } 

rezultat:

 // [2, 33] 
0
06 июля '17 в 23:50 2017-07-06 23:50 odgovor je dao Alex 6. srpnja 2006. u 23:50 2017-07-06 23:50

Možete koristiti trostruku metodu kako biste odlučili kako postupati s pozitivnim i negativnim cjelobrojnim vrijednostima.

 var myInt = (y > 0) ? Math.floor(y/x) : Math.floor(y/x) + 1 

Ako je broj pozitivan, sve je u redu. Ako je broj negativan, on će dodati 1 zbog načina na koji Math.floor tretira negativne.

0
08 июня '15 в 15:56 2015-06-08 15:56 odgovor je dao John Galt 08. lipnja u 15:56 sati 2015-06-08 15:56

Izračun broja stranica može se izvršiti u jednom koraku: Math.ceil (x / y)

0
11 нояб. odgovor dao user1920925 11 nov. 2017-11-11 18:48 '17 u 6:48 2017-11-11 18:48

Ako ste jednostavno podijeljeni u dva stupnja, možete koristiti operatore bitova:

 export function divideBy2(num) { return [num >> 1, num  1]; } export function divideBy4(num) { return [num >> 2, num  3]; } export function divideBy8(num) { return [num >> 3, num  7]; } 

(Prvi je privatan, drugi je ostatak)

0
13 сент. odgovor je dao Konstantin Möllers 13. rujna 2017-09-13 16:25 '17 u 16:25 2017-09-13 16:25

To će uvijek skratiti na nulu. Nisam siguran da je prekasno, ali ovdje je:

 function intdiv(dividend, divisor) { divisor = divisor - divisor % 1; if (divisor == 0) throw new Error("division by zero"); dividend = dividend - dividend % 1; var rem = dividend % divisor; return { remainder: rem, quotient: (dividend - rem) / divisor }; } 
0
11 мая '17 в 16:59 2017-05-11 16:59 Odgovor daje Bruno Corrêa Zimmermann Svibanj 11, '17 u 4:59 2017-05-05 16:59

Obično koristim (a - a % b) / b . Ovo vjerojatno nije najelegantnije, ali funkcionira.

0
20 мая '17 в 1:29 2017-05-20 01:29 odgovor je dao Wolf Elkan 20. svibnja 2006. u 1:29 2017-05-20 01:29