JavaScript przekształca dużą INT w notację naukową, gdy liczba staje się duża. Jak mogę temu zapobiec?
javascript
Chris
źródło
źródło
translate
transformację zawierającą współrzędne w notacji naukowej.Odpowiedzi:
Istnieje Number.toFixed , ale używa notacji naukowej, jeśli liczba wynosi> = 1e21 i ma maksymalną precyzję 20. Poza tym możesz rzucić własną, ale będzie bałagan.
Powyżej używa taniego „łatwego” powtórzenia łańcucha (
(new Array(n+1)).join(str)
). Możesz zdefiniowaćString.prototype.repeat
za pomocą rosyjskiego mnożenia chłopów i użyć tego zamiast tego.Ta odpowiedź powinna być stosowana tylko w kontekście pytania: wyświetlenie dużej liczby bez użycia notacji naukowej. Do wszystkiego innego należy użyć biblioteki BigInt , takiej jak BigNumber , Leemon's BigInt lub BigInteger . Idąc dalej, nowa natywna BigInt (uwaga: nie Leemona) powinna być dostępna; Chrom i oparte na nim przeglądarki ( Chrome , nowy Edge [v79 +], Brave ) i Firefox mają wsparcie; Wsparcie Safari jest w toku.
Oto jak użyjesz do tego BigInt:
BigInt(n).toString()
Przykład:
Pokaż fragment kodu
Uważaj jednak, że każda liczba całkowita, którą wyprowadzasz jako kod JavaScript (nie BigInt), który ma więcej niż 15-16 cyfr (a konkretnie więcej niż
Number.MAX_SAFE_INTEGER + 1
[9 007 199, 254, 64, 94, 992]) może być zaokrąglona, ponieważ typ liczby JavaScript (podwójna precyzja IEEE-754 zmiennoprzecinkowy) nie może dokładnie trzymać wszystkich liczb całkowitych poza tym punktem. PonieważNumber.MAX_SAFE_INTEGER + 1
działa w wielokrotnościach 2, więc nie może już przechowywać liczb nieparzystych (i podobnie, przy 18,014,398,508,489,481,984 zaczyna działać w wielokrotnościach 4, a następnie 8, a następnie 16, ...).W związku z tym, jeśli możesz polegać na
BigInt
wsparciu, wypisz swój numer jako ciąg znaków przekazywany doBigInt
funkcji:Przykład:
Pokaż fragment kodu
źródło
Math.abs
. Dzięki za zgłoszenie się.toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
powinien więc zwrócić prawdę, ale nie ...Wiem, że to starsze pytanie, ale pokazuje ostatnio aktywne. MDN toLocaleString
możesz użyć opcji, aby sformatować dane wyjściowe.
Uwaga:
Number.toLocaleString () zaokrągla po 16 miejscach dziesiętnych, dzięki czemu ...
...zwroty...
586084736227728400000000000000000000000
Jest to być może niepożądane, jeśli dokładność jest ważna w zamierzonym wyniku.
źródło
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
W przypadku małej liczby i wiesz, ile liczb dziesiętnych chcesz, możesz użyć toFixed, a następnie użyć wyrażenia regularnego, aby usunąć końcowe zera.
źródło
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
jeszcze jedno możliwe rozwiązanie:
źródło
Number.MAX_SAFE_INTEGER
jest prawdopodobne, że ten problem wystąpi .Oto mój krótki wariant
Number.prototype.toFixed
metody, który działa z dowolną liczbą:źródło
Number
. Jeśli rzucisz pierwszy na aNumber
, zobaczysz, że są absolutnie równe: jsfiddle.net/qd6hpnyx/1 . Możesz wycofać swój głos z powrotem:P
.0
pusty ciąg.console.log(2.2e307.toFixedSpecial(10))
. Mam na myśli ... Dostaję kilka zer końcowych. I tak głosowanie, ponieważ wydaje się najbliższe temu, czego potrzebuję.Poniższe rozwiązanie omija automatyczne formatowanie wykładnicze dla bardzo dużych i bardzo małych liczb. To rozwiązanie outisa z poprawką : nie działało dla bardzo małych liczb ujemnych.
źródło
Odpowiedzi innych osób nie podają dokładnej liczby!
Ta funkcja dokładnie oblicza żądaną liczbę i zwraca ją w ciągu, aby zapobiec jej zmianie przez javascript!
Jeśli potrzebujesz wyniku liczbowego, po prostu pomnóż wynik funkcji na pierwszym miejscu!
źródło
Wykorzystanie
.toPrecision
,.toFixed
itd można policzyć liczbę cyfr w numerze konwertując go do łańcucha z.toString
potem patrzy na jej.length
.źródło
(2e64).toString()
wróci"2e+64"
, więc.length
jest bezużyteczne.Właśnie tego użyłem, aby pobrać wartość z danych wejściowych, zwiększając liczby mniejsze niż 17 cyfr i konwertując liczby wykładnicze na x10 y
źródło
Możesz zapętlić liczbę i uzyskać zaokrąglenie
źródło
Próbowałem pracować z formą ciągu zamiast z liczbą i wydawało się, że to działa. Testowałem to tylko w Chrome, ale powinno być uniwersalne:
źródło
Myślę, że może być kilka podobnych odpowiedzi, ale oto coś, co wymyśliłem
Uwaga: jest to tak dokładne, jak funkcje matematyczne w javascript, i ma problemy przy użyciu log zamiast log10 w linii przed pętlą for; zapisze 1000 w bazie-10 jako 000, więc zmieniłem go na log10, ponieważ ludzie i tak będą w większości używać bazy-10.
To może nie być bardzo dokładne rozwiązanie, ale z dumą mogę powiedzieć, że może z powodzeniem tłumaczyć liczby między bazami i ma opcję przecinków!
źródło
Twoje pytanie:
Możesz użyć tego: https://github.com/MikeMcl/bignumber.js
lubię to:
źródło
Wiem, że minęło wiele lat, ale ostatnio pracowałem nad podobnym problemem i chciałem opublikować swoje rozwiązanie. Akceptowana obecnie odpowiedź uzupełnia część wykładnikową zerami, a moja próbuje znaleźć dokładną odpowiedź, chociaż generalnie nie jest idealnie dokładna dla bardzo dużych liczb z powodu ograniczenia JS w precyzji zmiennoprzecinkowej.
To działa
Math.pow(2, 100)
, zwracając poprawną wartość 1267650600228229401496703205376.źródło
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
z niektórymi problemami:
źródło
Wyrzucanie wyrażeń regularnych. Nie ma to problemów z precyzją i nie zawiera dużo kodu.
źródło
Jeśli robisz to tylko w celu wyświetlenia, możesz zbudować tablicę z cyfr, zanim zostaną zaokrąglone.
źródło
Obecnie nie ma natywnej funkcji do rozwiązania notacji naukowej. Jednak w tym celu musisz napisać własną funkcjonalność.
Tutaj jest mój:
źródło
Możesz użyć modułu wykładniczego . Jest lekki i w pełni przetestowany.
źródło
Możesz także użyć YourJS.fullNumber. Na przykład
YourJS.fullNumber(Number.MAX_VALUE)
powoduje, że:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Działa również w przypadku naprawdę małych liczb.
YourJS.fullNumber(Number.MIN_VALUE)
zwraca to:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
Należy zauważyć, że ta funkcja zawsze zwraca liczby skończone jako ciągi znaków, ale zwraca liczby nieskończone (np.
NaN
LubInfinity
) jakoundefined
.Możesz to przetestować w konsoli YourJS tutaj .
źródło
Możesz użyć
number.toString(10.1)
:Uwaga: obecnie działa to w Chrome, ale nie w Firefox. Specyfikacja mówi, że podstawa musi być liczbą całkowitą, więc powoduje to niewiarygodne zachowanie.
źródło
10.1
lub10
nic nie jest równoważne.Miałem ten sam problem z notacją naukową zwracającą wyrocznię, ale potrzebowałem rzeczywistej liczby dla adresu URL. Właśnie użyłem sztuczki PHP, odejmując zero i otrzymuję poprawną liczbę.
na przykład 5.4987E7 to val.
newval wynosi teraz 54987000
źródło