Chciałbym przekonwertować liczbę zmiennoprzecinkową na liczbę całkowitą w JavaScript. Właściwie chciałbym wiedzieć, jak ZROBIĆ standardowe konwersje: przez obcinanie i zaokrąglanie. I skutecznie, nie poprzez konwersję na ciąg i parsowanie.
javascript
syntax
mcherm
źródło
źródło
Odpowiedzi:
Odwołanie do obiektu matematycznego
Przykłady
Pozytywny Negatywny Pozytywne - większe liczby Ujemne - Większe liczbyźródło
var intValue = ~~floatValue;
. Jeżeli zapis jest zbyt zaciemniać do własnych upodobań, po prostu schować go w funkcji:function toInt(value) { return ~~value; }
. (To również zamienia ciągi znaków na liczby całkowite, jeśli masz na toMath.trunc(val);
Skomentuj, ponieważ jest to zaakceptowana odpowiedź2.3 - 2.3 % 1
Bitowy operator OR
Do obcinania liczb zmiennoprzecinkowych można użyć operatora bitowego lub operatora. Działa to zarówno z dodatnimi, jak i ujemnymi wartościami:
Wyniki
Porównanie wydajności?
Stworzyłem test JSPerf, który porównuje wydajność między:
Math.floor(val)
val | 0
bitowe LUB~~val
bitowe NIEparseInt(val)
która działa tylko z liczbami dodatnimi. W takim przypadku możesz bezpiecznie używać operacji bitowych i
Math.floor
funkcji.Ale jeśli potrzebujesz kodu do pracy zarówno z dodatnimi, jak i ujemnymi , wtedy operacja bitowa jest najszybsza (LUB jest preferowana). Ten drugi test JSPerf porównuje to samo, gdzie jest całkiem oczywiste, że ze względu na dodatkowe sprawdzanie znaków Math jest teraz najwolniejszy z czterech.
Uwaga
Jak stwierdzono w komentarzach, operatorzy BITWISE działają na podpisanych 32-bitowych liczbach całkowitych, dlatego duże liczby zostaną przekonwertowane, na przykład:
źródło
Math.floor()
jest szybszy (przynajmniej według mojego pierwszego testu JSPerf w Google Chrome, wersja 30.0.1599.101), bardziej niezawodny (ponieważ nie zależy od tego, jak liczby są reprezentowane w bitach, co może zmienić i być może złamać to bitowe rozwiązanie), a co najważniejsze, bardziej jednoznacznie.~~
jest lepszy, ponieważ jest to jednoargumentowy operator.4.2|0+4
równa się,4
ale~~4.2+4
równa8
Uwaga: Nie możesz użyć
Math.floor()
jako zamiennika obcięcia, ponieważMath.floor(-3.1) = -4
i nie-3
!!Prawidłowym zamiennikiem obcięcia byłoby:
źródło
Math.trunc(value)
dodano w ECMAScript 6floor
zaokrągla w kierunku-nieskończoności,truncate
zaokrągla w kierunku zera. (ceil
zaokrągla w kierunku + nieskończoność).Do obcinania liczb zmiennoprzecinkowych można zastosować podwójny bitowy operator nie będący operatorem. Inne operacje, które wymieniłeś są dostępne
Math.floor
,Math.ceil
iMath.round
.Więcej szczegółów dzięki uprzejmości Jamesa Padolseya.
źródło
<canvas>
silniku renderującym czcionki w JS . Dziękuję Ci!Do obcinania:
Dla rundy:
źródło
Możesz użyć metody parseInt bez zaokrąglania. Uważaj na dane wprowadzane przez użytkownika ze względu na opcje prefiksu 0x (hex) i 0 (octal).
źródło
parseInt(1000000000000000000000, 10);
wynikiem jest 1, a nie 1 000 000 000 000 000 000 000. W każdym razie pytanie wyraźnie nie chciało „ konwertowania na ciąg i parsowanie ”, choć jest to stosunkowo niewielkie ...;)parseInt()
oczekuje, że łańcuch nie będzie liczbą jako pierwszym parametrem. Gdy przekażesz tę liczbę całkowitą, jest ona konwertowana na,1e21
a następnieparseInt
analizuje ciąg1e21
, co skutkuje1
.Przesunięcie bitu o 0, co odpowiada podziałowi przez 1
źródło
>> 0
wydaje się działać tylko dla liczb całkowitych < 2 ^ 31-1 i>>> 0
dla liczb całkowitych < 2 ^ 32-1 . Zwraca 0 dla większych wartościW twoim przypadku, jeśli chcesz na końcu napis (w celu wstawienia przecinków), możesz również po prostu użyć
Number.toFixed()
funkcji, jednak spowoduje to zaokrąglenie.źródło
Tutaj jest wiele sugestii. Bitowa OR wydaje się zdecydowanie najprostsza. Oto kolejne krótkie rozwiązanie, które działa również z liczbami ujemnymi przy użyciu operatora modulo. Prawdopodobnie jest to łatwiejsze do zrozumienia niż bitowe LUB:
Ta metoda działa również z liczbami o wysokiej wartości, w których ani „| 0”, ani „~~”, ani „>> 0” nie działają poprawnie:
źródło
Aby obciąć :
Aby zaokrąglić :
źródło
Jeszcze jeden możliwy sposób - użyj operacji XOR:
Priorytet operacji bitowych jest mniejszy niż priorytet operacji matematycznych, jest to przydatne. Spróbuj na https://jsfiddle.net/au51uj3r/
źródło
Jeśli spojrzysz na natywny
Math
obiekt w JavaScript, dostaniesz całą masę funkcji do pracy na liczbach i wartościach itp.Zasadniczo to, co chcesz zrobić, jest dość proste i natywne w JavaScript ...
Wyobraź sobie, że masz numer poniżej:
a teraz, jeśli chcesz zaokrąglić w dół do najbliższej liczby, po prostu wykonaj:
i dostajesz:
Jeśli chcesz zaokrąglić w górę do najbliższej liczby, po prostu wykonaj:
i dostajesz:
Po
Math.round
prostu zaokrąglij go do wyższej lub niższej liczby, zależnie od tego, która z nich jest bliżej liczby flot.Możesz także użyć liczby
~~
spoza liczby zmiennoprzecinkowej, która zamieni liczbę zmiennoprzecinkową na liczbę całkowitą.Możesz używać go jak
~~myValue
...źródło
~~
ponieważ jeśli liczba jest większa niż limit int 32, zmieni wartość na wartość graniczną int 32.źródło
Chcę tylko zaznaczyć, że pieniężnie chcesz zaokrąglać, a nie obcinać. Posiadanie grosza jest znacznie mniej prawdopodobne, ponieważ 4.999452 * 100 zaokrąglone da 5, bardziej reprezentatywną odpowiedź.
Co więcej, nie zapominaj o zaokrąglaniu przez bankiera , który jest sposobem na przeciwdziałanie lekko pozytywnemu nastawieniu, jakie daje proste zaokrąglanie - Twoja aplikacja finansowa może tego wymagać.
Zaokrąglanie Gaussa / bankiera w JavaScript
źródło
Jeśli używasz angularjs, to proste rozwiązanie w następujący sposób: Wiązanie szablonów HTML
{{val | number:0}}
zamieni val na liczbę całkowitą
przejdź przez ten link docs.quarejs.org/api/ng/filter/number
źródło