Dlaczego musimy używać parametru radix podczas wywoływania parseInt?

Odpowiedzi:

103

Nie zawsze możesz chcieć przeanalizować liczbę całkowitą do liczby o podstawie 10, więc podanie podstawy umożliwia określenie innych systemów liczbowych.

Podstawa to liczba wartości dla jednej cyfry. Szesnastkowy to 16. ósemkowy to 8, dwójkowy to 2 i tak dalej ...

W parseInt()funkcji jest kilka rzeczy, które możesz zrobić, aby wskazać podstawę bez jej podawania. Mogą one również działać przeciwko tobie, jeśli użytkownik wprowadza ciąg, który pasuje do jednej z reguł, ale nie ma wyraźnego zamiaru. Na przykład:

// Numbers with a leading 0 used a radix of 8 (octal) before ECMAScript 5.
// These days, browsers will treat '0101' as decimal.
var result = parseInt('0101');

// Numbers that start with 0x use a radix of 16 (hexidecimal)
var result = parseInt('0x0101');

// Numbers starting with anything else assumes a radix of 10
var result = parseInt('101');

// Or you can specify the radix, in this case 2 (binary)
var result = parseInt('0101', 2);
Justin Niessner
źródło
2
Więc parseInt ('0101') daje 101 lub 65?
Vivekh
7
@Vivekh - W 2011 r., Kiedy pierwotnie zamieściłem odpowiedź, poparłem go. Szybkie sprawdzenie w Google Chrome wydaje się wskazywać, że trochę się zmieniły. parseInt('0101')teraz wraca 101. Jednak różne przeglądarki mogą zachowywać się inaczej. Zawsze uwzględniaj podstawę, aby uzyskać wiarygodne wyniki.
Justin Niessner
@Vivekh - Możesz zobaczyć najnowszą dokumentację na developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Justin Niessner
Najnowsza dokumentacja mówi, że ES 5 nie określa, że ​​żadna podstawa nie powinna być traktowana tak samo jak przekazanie 10, ale ostrzega, aby mimo to przekazać ją w przypadku obsługi starszych przeglądarek.
Juan Mendes,
1
Zawsze używałem parseInt(x, 0)z jakiegoś powodu, którego teraz nie pamiętam .. czy to jest równe parseInt(x, 10)zastanawiam się teraz ...
OZZIE
35

Ponieważ jeśli masz liczbę łańcuchową, taką jak 0700i chcesz, aby wynik był liczbą całkowitą 700, musisz poinformować parseInt(), że jest to liczba dziesiętna, a nie ósemkowa.

console.log(parseInt("0700"));
// 448

// I really wanted decimal (base 10)
console.log(parseInt("0700", 10));
// 700

// What is this? Binary, Decimal, Octal?
console.log(parseInt("0110"));
// 72

// as binary
console.log(parseInt("0110", 2));
// 6
Uwaga : Odpowiedziałem tylko na połowę twojego pytania. Zobacz innych, aby poznać dobre definicje tego, czym właściwie jest podstawa.

Michaela Berkowskiego
źródło
1
Również parseInt binarny ('10101', 2)
Joe,
1
console.log (parseInt ("0700")); zwraca // 700, a nie 448.
Naren
@Naren 8 lat temu było to 448 w dowolnej konsoli przeglądarki, w której to uruchomiłem. We współczesnym Chrome i Node dostałem dziś 700, ale może było to wtedy niezdefiniowane zachowanie.
Michael Berkowski
@MichaelBerkowski Ostatnio zauważyłem tę różnicę - najwyraźniej liczby ósemkowe ES6 zaczynają się od 0ozamiast0
Sᴀᴍ Onᴇᴌᴀ
7

Radix jest podstawą systemu numeracji. Istnieje nieskończona liczba systemów numerycznych, ale te, które większość ludzi zna, to podstawa 10 (dziesiętna) i podstawa 2 (binarna).

Wartości liczbowe mogą być różnie interpretowane w różnych bazach. Na przykład liczba 10 w systemie dwójkowym może być reprezentowana jako 2 w systemie dziesiętnym.

W przypadku parseInt(), podstawa umożliwia określenie używanej podstawy. Domyślnie używana jest podstawa 10.

Jednak podstawa powinna być zawsze określona, ​​nawet w przypadku używania podstawy 10. Rozważmy przypadek

parseInt("010") // Zwraca 8

Na pierwszy rzut oka możesz oczekiwać, że instrukcja zwróci 10. Wyraźne użycie podstawy pomoże uniknąć nieporozumień:

parseInt("010", 10) // Zwraca: 10

George Cummins
źródło
4

Podstawa to numer podstawowy systemu liczbowego: http://en.wikipedia.org/wiki/Radix

Zwykle wystarczy określić podstawę, jeśli chcesz, aby była inna niż 10. Dokładniej (z http://www.w3schools.com/jsref/jsref_parseInt.asp ):

Jeśli parametr radix zostanie pominięty, JavaScript zakłada, co następuje:

Jeśli łańcuch zaczyna się od „0x”, podstawą jest 16 (szesnastkowo). Jeśli ciąg zaczyna się od „0”, podstawą jest 8 (ósemkowa). Ta funkcja jest przestarzała Jeśli ciąg znaków zaczyna się od innej wartości, podstawą jest 10 (dziesiętnie)

Mathias Schwarz
źródło
2

Dodam tylko dodatkowe informacje, które jasno odpowiadają na pytanie:

Jeśli podstawa jest niezdefiniowana lub 0 (lub nieobecna), JavaScript zakłada, że:

  • […]
  • Jeśli ciąg wejściowy zaczyna się od „0”, podstawa to osiem (ósemkowe) lub 10 (dziesiętne). Dokładna wybrana podstawa zależy od implementacji. ECMAScript 5 określa, że ​​używane jest 10 (dziesiętne), ale nie wszystkie przeglądarki jeszcze to obsługują. Z tego powodu zawsze określaj podstawę, gdy używasz parseInt.
  • […]

Źródło: MDN parseInt ()

nmoliveira
źródło
2

To tylko moja opinia, ale pomysł, że „musimy użyć Radix” szybko się dezaktualizuje. Problem naprawdę pojawił się jakiś czas temu, ponieważ ludzie spoza świata IT zwykle nie używają innych zapisów liczbowych niż dziesiętne i dość często podają liczby dziesiętne uzupełnione zerami, takie jak „010”. Ale ponieważ liczby ósemkowe ECMAScript 6 w JS są poprzedzone przedrostkiem „0o”, a nie tylko „0”, jak to było w ECMAScript 5 i 3. Więc jeśli nie kierujesz reklamy na rodzinę IE (to nie jest teraz rzadka sytuacja) możesz pominąć radix bezpiecznie.

Konstantin Smolyanin
źródło
1

Parametr radix służy do określenia, który system liczbowy ma zostać użyty, na przykład podstawa 16 (szesnastkowa) wskazuje, że liczba w ciągu powinna być analizowana od liczby szesnastkowej do liczby dziesiętnej.

Jeśli parametr radix zostanie pominięty, JavaScript zakłada, co następuje:

Jeśli ciąg zaczyna się od „0x”, podstawa to 16 (szesnastkowo)

Jeśli ciąg zaczyna się od „0”, podstawą jest 8 (ósemkowa). Ta funkcja jest przestarzała

Jeśli ciąg zaczyna się od innej wartości, podstawa wynosi 10 (dziesiętnie)

Źródło W3Schools

Jeremy Seekamp
źródło
1

Co to jest radix w paseInt ()?

parseInt()Funkcja analizuje ciąg i zwraca liczbę całkowitą. Jako podstawa przyjmuje drugi argument , który określa podstawę liczby w ciągu . Podstawa może być liczbą całkowitą od 2i 36.

Wywołanie funkcji wygląda następująco (Składnia):

parseInt(string, radix);

Kilka przykładów wyjaśniających pojęcie radix

Przykład 1:

var a = parseInt("11", 2);

Radix zmienna mówi, że „11” jest w systemie binarnym lub podstawy 2 . Dlatego ten przykład konwertuje ciąg „11” na liczbę całkowitą 3.

Przykład 2:

var a = parseInt("10011", 16);

Tutaj podstawa mówi, parseInt()że 10011jest liczbą szesnastkową, a zatem w liczbie całkowitej zostanie przekonwertowana na65553

Krótko mówiąc, argument radix mówi, parseInt()że łańcuch przekazany jako pierwszy parametr pochodzi z określonego systemu (binarny, szesnastkowy itp.) I musi zostać przekonwertowany na liczbę całkowitą jako produkt końcowy.

mishsx
źródło