Mam liczby zmiennoprzecinkowe takie jak 3.2
i 1.6
.
Muszę oddzielić liczbę na liczbę całkowitą i dziesiętną. Na przykład wartość 3.2
będzie podzielona na dwie liczby, tj. 3
I0.2
Uzyskanie części całkowitej jest łatwe:
n = Math.floor(n);
Ale mam problem z uzyskaniem części dziesiętnej. Próbowałem tego:
remainer = n % 2; //obtem a parte decimal do rating
Ale nie zawsze działa poprawnie.
Poprzedni kod ma następujące dane wyjściowe:
n = 3.1 => remainer = 1.1
Czego tu brakuje?
n = Math.floor(n);
zwraca tylko pożądany wynik (część całkowitą) dla liczb nieujemnych% 1
nie używaj% 2
Odpowiedzi:
Użyj
1
, nie2
.źródło
Math.*
ani%
operacji.toFixed
może pomóc w niektórych sytuacjach, np .(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
jeśli potrzebujesz go bez0.
2.3
powstał, a nie2
czy3
liczba0.2999999999999998
jest całkowicie dopuszczalne, pomimo jak obrażanie wygląda dla ludzkich oczu.Chociaż to nie zadziała dla liczb ujemnych, więc być może będziemy musieli to zrobić
źródło
Math.floor()
ponownie - użyj obliczonej części całkowitej.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
użyj Math.floor () tylko raz.integr = 3; decimal = 0.20000000000000018;
Math.floor
zMath.trunc
.Możesz przekonwertować na ciąg, prawda?
źródło
n.toString()
zamiast,n + ""
ponieważ jest bardziej czytelny.n + ""
to rzeczywiście jest lepsza (patrz jsperf.com/number-vs-number-tostring-vs-string-number ).
jako separatora dziesiętnego, więc wszystko jest w porządku, jeśli typ zmiennej wejściowej jest zmiennoprzecinkowy. Musisz poradzić sobie z tym problemem, tylko jeśli dane wejściowe są ciągiem. Muszę też zauważyć, że ta odpowiedź zwraca ciąg znaków w tablicy. Bardziej kompletnym rozwiązaniem jestparseFloat('0.' + (n + '').split('.')[1])
W jaki sposób 0.2999999999999998 jest akceptowalną odpowiedzią? Gdybym był pytającym, chciałbym uzyskać odpowiedź .3. Mamy tutaj fałszywą precyzję, a moje eksperymenty z floor,% itd. Wskazują, że Javascript lubi fałszywą precyzję w tych operacjach. Myślę więc, że odpowiedzi wykorzystujące konwersję na ciąg znaków są na dobrej drodze.
Zrobiłbym to:
W szczególności użyłem 100233.1 i chciałem uzyskać odpowiedź „.1”.
źródło
.toString()
nie uwzględnia i18n. Separator dziesiętny zawsze będzie.
zgodny z MDN i specyfikacją ECMAOto jak to robię, co moim zdaniem jest najprostszym sposobem, aby to zrobić:
źródło
Prostym sposobem na to jest:
Niestety nie zwraca to dokładnej wartości. Można to jednak łatwo naprawić:
Możesz użyć tego, jeśli nie znasz liczby miejsc dziesiętnych:
źródło
Niezależny od języka sposób:
zwróć uwagę, że jest to poprawne tylko dla liczb o jednej długości fraktalnej)
źródło
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Możesz użyć
parseInt()
funkcji, aby uzyskać część całkowitą, niż użyć do wyodrębnienia części dziesiętnejLub możesz użyć wyrażenia regularnego, takiego jak:
źródło
0.20000000000000018
... to jest naprawdę trudne, ponieważ0.2 < 0.20000000000000018
zwraca true. 3.2 powinno zwrócić 0.2: P robi tyle nieregularności i używa.toFixed(2)
łańcucha zwrotów: PPoniższe działa niezależnie od ustawień regionalnych separatora dziesiętnego ... pod warunkiem, że dla separatora użyty zostanie tylko jeden znak.
To nie jest ładne, ale dokładne.
źródło
Jeśli precyzja ma znaczenie i potrzebujesz spójnych wyników, oto kilka propozycji, które zwrócą dziesiętną część dowolnej liczby jako ciąg, w tym wiodące „0”. Jeśli potrzebujesz go jako pływaka, po prostu dodaj
var f = parseFloat( result )
na końcu.Jeśli część dziesiętna jest równa zero, zwracane jest „0.0”. Liczby zerowe, NaN i niezdefiniowane nie są testowane.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Oto link jsPerf: https://jsperf.com/decpart-of-number/
Widzimy, że propozycja nr 2 jest najszybsza.
źródło
Możesz przekonwertować go na ciąg i użyć
replace
metody, aby zamienić część całkowitą na zero, a następnie przekonwertować wynik z powrotem na liczbę:źródło
/^[^,]/
), ale powinieneś zostawić wynik jako ciąg znaków (usunąć+
operator), aby uniknąćNaN
wyników.W zależności od zastosowania, które podasz później, to proste rozwiązanie może ci również pomóc.
Nie twierdzę, że jest to dobre rozwiązanie, ale w niektórych konkretnych przypadkach działa
Ale zajmie to więcej czasu niż proponowane rozwiązanie @Brian M. Hunt
źródło
Miałem przypadek, w którym wiedziałem, że wszystkie omawiane liczby będą miały tylko jedną dziesiętną, i chciałem uzyskać część dziesiętną jako liczbę całkowitą, więc ostatecznie zastosowałem takie podejście:
Działa to również dobrze z liczbami całkowitymi, zwracając w takich przypadkach 0.
źródło
Ja używam:
Dane wejściowe: -556,123444444
Wynik: 123444444
źródło
Funkcje matematyczne są szybsze, ale zawsze zwracają nie natywne oczekiwane wartości. Najłatwiejszy sposób, jaki znalazłem to
źródło
Dobrą opcją jest przekształcenie liczby w ciąg, a następnie podzielenie.
W jednym wierszu kodu
źródło
Po przejrzeniu kilku z nich używam teraz ...
źródło
źródło
Chociaż jestem bardzo późno, aby odpowiedzieć na to pytanie, proszę spojrzeć na kod.
źródło
Format znaku i liczby zmiennoprzecinkowej może być zależny od country (
.,
), więc niezależne rozwiązanie, które zachowało część zmiennoprzecinkową, to:- jest to rozwiązanie międzynarodowe, a nie zależne od lokalizacji:
Opis rozwiązania krok po kroku:
parseFloat()
dla zagwarantowania korekcji wejściowejMath.abs()
dla uniknięcia problemów z liczbami ujemnymin = parseInt(x)
za uzyskanie części dziesiętnejx - n
do odejmowania części dziesiętnejtoFixed()
z liczbą cyfr w ruchomej części oryginalnego numeru zmiennoprzecinkowegox
. Liczba jest obliczana jako różnica między długością oryginalnej liczbyx
a liczbąn
w ich reprezentacji ciągu.źródło
Użyj tego:
Math.frac
Funkcja tutaj ma 3 tryby pracy:To proste :)
źródło
źródło