Kako pretvoriti broj s pomičnim zarezom u cijeli broj u javascriptu?

Htjela bih pretvoriti float u cijeli broj u javascript. Zapravo, volio bih znati kako to činiti OBE standardne konverzije: skraćivanjem i zaokruživanjem. I učinkovito, a ne pretvaranjem u niz i parsiranje.

923
27 февр. set mcherm 27. velj 2009-02-27 23:15 '09 u 23:15 2009-02-27 23:15
@ 14 odgovora
 var intvalue = Math.floor( floatvalue ); var intvalue = Math.ceil( floatvalue ); var intvalue = Math.round( floatvalue ); // 'Math.trunc' was added in ECMAScript 6 var intvalue = Math.trunc( floatvalue ); 

Matematička referenca objekata


primjeri

pozitivan
 // value=x // x=5 5<x<5.5 5.5<=x<6 Math.floor(value) // 5 5 5 Math.ceil(value) // 5 6 6 Math.round(value) // 5 5 6 Math.trunc(value) // 5 5 5 parseInt(value) // 5 5 5 ~~value // 5 5 5 value | 0 // 5 5 5 value >> 0 // 5 5 5 value >>> 0 // 5 5 5 value - value % 1 // 5 5 5 
negativan
 // value=x // x=-5 -5>x>=-5.5 -5.5>x>-6 Math.floor(value) // -5 -6 -6 Math.ceil(value) // -5 -5 -5 Math.round(value) // -5 -5 -6 Math.trunc(value) // -5 -5 -5 parseInt(value) // -5 -5 -5 value | 0 // -5 -5 -5 ~~value // -5 -5 -5 value >> 0 // -5 -5 -5 value >>> 0 // 4294967291 4294967291 4294967291 value - value % 1 // -5 -5 -5 
Pozitivno - Veliki brojevi
 // x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1 // value=xx=900719925474099 x=900719925474099.4 x=900719925474099.5 Math.floor(value) // 900719925474099 900719925474099 900719925474099 Math.ceil(value) // 900719925474099 900719925474100 900719925474100 Math.round(value) // 900719925474099 900719925474099 900719925474100 Math.trunc(value) // 900719925474099 900719925474099 900719925474099 parseInt(value) // 900719925474099 900719925474099 900719925474099 value | 0 // 858993459 858993459 858993459 ~~value // 858993459 858993459 858993459 value >> 0 // 858993459 858993459 858993459 value >>> 0 // 858993459 858993459 858993459 value - value % 1 // 900719925474099 900719925474099 900719925474099 
Negativno - Veliki brojevi
 // x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1 // value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6 Math.floor(value) // -900719925474099 -900719925474100 -900719925474100 Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099 Math.round(value) // -900719925474099 -900719925474099 -900719925474100 Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099 parseInt(value) // -900719925474099 -900719925474099 -900719925474099 value | 0 // -858993459 -858993459 -858993459 ~~value // -858993459 -858993459 -858993459 value >> 0 // -858993459 -858993459 -858993459 value >>> 0 // 3435973837 3435973837 3435973837 value - value % 1 // -900719925474099 -900719925474099 -900719925474099 
1296
27 февр. odgovor je dan u sjenci 27. veljače. 2009-02-27 23:21 '09 u 23:21 2009-02-27 23:21

Operator s bitovima ILI

Bitovski ili operator se može koristiti za skraćivanje brojeva s pomičnim zarezom i radi s pozitivnim i negativnim:

 function float2int (value) { return value | 0; } 

rezultati

 float2int(3.1) == 3 float2int(-3.1) == -3 float2int(3.9) == 3 float2int(-3.9) == -3 

Usporedba izvedbe?

Napravio sam JSPerf test koji uspoređuje izvedbu između:

border=0
  • Math.floor(val)
  • val | 0 val | 0 bitni OR
  • ~~val bit NE
  • parseInt(val)

koja radi samo s pozitivnim brojevima. U tom slučaju možete sigurno koristiti bitne operacije, kao i funkciju Math.floor .

Ali ako vam je potreban kod za rad s pozitivnim, kao i sa negativima , bitna operacija će biti najbrža (ILI se preferira). Ovaj drugi test JSPerf uspoređuje isti, gdje je prilično očito da je, zbog dodatne provjere, znak Math sada najsporija četiri.

primjedba

Kao što je navedeno u komentarima, BITWISE operatori rade s potpisanim 32-bitnim cijelim brojevima, tako da će se veliki brojevi pretvoriti, na primjer:

 1234567890 | 0 => 1234567890 12345678901 | 0 => -539222987 
272
11 окт. Odgovor dao je Robert Koritnik 11. listopada 2012-10-11 13:18 '12 u 13:18 2012-10-11 13:18

Napomena. Ne možete koristiti Math.floor() kao zamjenu za skraćivanje, jer Math.floor(-3.1) = -4 a ne -3 !!

Ispravna zamjena za skraćivanje bit će:

 function truncate(value) { if (value < 0) { return Math.ceil(value); } return Math.floor(value); } 
91
14 окт. odgovor daje korisnik189987 14. listopada 2009-10-14 19:17 '09 u 19:17 2009-10-14 19:17

Za rezanje plovaka može se koristiti dvostruki bit . Ostale operacije koje ste opisali dostupne su putem Math.floor , Math.ceil i Math.round .

 > ~~2.5 2 > ~~(-1.4) -1 

Detalji dobiveni Jamesom Padolsijem.

42
11 янв. Odgovor je dan brad 11 jan. 2012-01-11 19:54 '12 u 19:54 2012-01-11 19:54

Za skraćivanje:

 var intvalue = Math.floor(value); 

Za krug:

 var intvalue = Math.round(value); 
37
27 февр. Odgovor je dao Mike 27. veljače 2009-02-27 23:22 '09 u 11:22 AM 2009-02-27 23:22

Možete koristiti metodu parseInt bez zaokruživanja. Budite oprezni s korisničkim unosom zbog opcija 0x (hex) i 0 (oktalni).

 var intValue = parseInt(floatValue, 10); 
22
26 сент. Odgovor daje Graeme Wicksted 26. rujna. 2011-09-26 23:41 '11 u 23:41 2011-09-26 23:41

Bit je pomaknut za 0, što je ekvivalentno dijeljenju s 1

 // >> or >>> 2.0 >> 0; // 2 2.0 >>> 0; // 2 
17
25 июля '13 в 10:33 2013-07-25 10:33 odgovor je dat Prasanthu 25. srpnja '13. u 10:33 u 2013-07-25 10:33

U vašem slučaju, kada vam je potreban niz na kraju (za umetanje zareza), možete također koristiti funkciju Number.toFixed (), ali to će se zaokružiti.

7
14 окт. Odgovor je dao Russell Leggett 14. listopada. 2009-10-14 19:30 '09 u 19:30 2009-10-14 19:30

Postoje mnoge ponude. Bitwise OR je vjerojatno najjednostavniji. Ovdje je još jedno kratko rješenje koje također radi s negativnim brojevima pomoću modulo operatora. Vjerojatno lakše razumjeti od bitovskog ILI:

 intval = floatval - floatval%1; 

Ova metoda također radi s velikim brojem vrijednosti, pri čemu ni jedna ni druga 0 ', niti "~~", niti "→ 0" ne rade ispravno:

 > n=4294967295; > n|0 -1 > ~~n -1 > n>>0 -1 > nn%1 4294967295 
6
11 июля '13 в 16:42 2013-07-11 16:42 odgovor je Juliane Holzt 11. srpnja '13. u 4:42 2013-07-11 16:42

Drugi mogući način je korištenje operacije XOR:

 console.log(12.3 ^ 0); // 12 console.log("12.3" ^ 0); // 12 console.log(1.2 + 1.3 ^ 0); // 2 console.log(1.2 + 1.3 * 2 ^ 0); // 3 console.log(-1.2 ^ 0); // -1 console.log(-1.2 + 1 ^ 0); // 0 console.log(-1.2 - 1.3 ^ 0); // -2 

Prioritet bitnih operacija je manji od prioriteta matematičkih operacija, što je korisno. Pokušajte na https://jsfiddle.net/au51uj3r/

5
28 февр. Odgovor Dmitry Kharitonov 28. veljače. 2016-02-28 20:45 '16 u 20:45 2016-02-28 20:45

Za skraćivanje :

 // Math.trunc() is part of the ES6 spec Math.trunc( 1.5 ); // returns 1 Math.trunc( -1.5 ); // returns -1 // Math.floor( -1.5 ) would return -2, which is probably not what you wanted 

U krugu :

 Math.round( 1.5 ); // 2 Math.round( 1.49 ); // 1 Math.round( -1.6 ); // -2 Math.round( -1.3 ); // -1 
1
22 сент. odgovor dan Razor 22. rujna 2015-09-22 17:46 '15 u 17:46 2015-09-22 17:46

Ako u JavaScriptu pogledate vlastiti Math objekt, dobit ćete cijeli niz funkcija za rad s brojevima i vrijednostima, itd.

U osnovi, ono što želite učiniti je prilično jednostavno i ugrađeno u JavaScript ...

Zamislite da imate broj ispod:

 const myValue = 56.4534931; 

i sada, ako ga želite zaokružiti na najbliži broj, učinite sljedeće:

 const rounded = Math.floor(myValue); 

i dobit ćete:

 56 

Ako ga želite zaokružiti na najbliži broj, pokrenite:

 const roundedUp = Math.ceil(myValue); 

i dobit ćete:

 57 

Također, Math.round samo Math.round to na veći ili manji broj, ovisno o tome koji je bliže broju flota.

Također možete koristiti ~~ nakon broja s pomičnim zarezom, koji pretvara broj s pomičnim zarezom u cijeli broj.

Možete ga koristiti kao ~~myValue ...

0
31 янв. Odgovor daje Alireza 31. siječnja. 2019-01-31 12:33 '19 u 12:33 sati 2019-01-31 12:33

Ako koristite angularjs, onda jednostavno rješenje, kao što je navedeno u HTML Template Binding

{{val | number:0}}

pretvara val u cijeli broj

idite na ovu vezu docs.angularjs.org/api/ng/filter/number

0
20 янв. Odgovor je dao Jameel Grand 20. siječnja. 2017-01-20 13:36 '17 u 13:36 2017-01-20 13:36

Želim samo naznačiti da se želite monetički zaokružiti, a ne trunc. Biti na peni je puno manje vjerojatno, jer 4.999452 * 100 zaokružen će vam dati 5, više reprezentativni odgovor.

Osim toga, nemojte zaboraviti na zaokruživanje bankara , što je način da se suzbije malo pozitivna pristranost koju izravno zaokružuje - vaša financijska aplikacija to može zahtijevati.

Gaussov / bankarski zaokruživanje u JavaScriptu

0
04 нояб. Odgovor koji je dao Gerard ONeill 04 Nov. 2015-11-04 19:20 '15 u 19:20 2015-11-04 19:20

Ostala pitanja o oznaka ili Postavite pitanje