#ruby
#ruby
Вопрос:
Кто-нибудь может объяснить, как работает базовый параметр при вызове to_i
на следующих примерах?
'2'.to_i(2) #=> 0
'3'.to_i(2) #=> 0
'12'.to_i(2) #=> 1
'122'.to_i(2) #=> 1
'20'.to_i(2) #=> 0
'21'.to_i(2) #=> 0
Я не понимаю, как это на самом деле работает. Кто-нибудь может объяснить, пожалуйста?
Комментарии:
1.
"2".to_i #=> 2
,2.to_s(2) #=> "10"
,"10".to_i(2) #=> 2
;2.to_s #=> "2"
.2. это тот случай, когда вы должны использовать
Integer(x, 2)
вместоx.to_i(2)
. Последний никогда не выдаст ошибку, но он также, вероятно, делает не то, что вы хотите.
Ответ №1:
По той же причине, что и '54thousand'.to_i
is 54
: to_i
считывает до тех пор, пока не найдет конец строки или недопустимую цифру.
В двоичном формате (база 2) единственными допустимыми цифрами являются 0
и 1
. Таким образом, поскольку 2
недопустимо, '122'.to_i(2)
идентично '1'.to_i(2)
. Кроме того, '2'.to_i(2)
идентичен ''.to_i(2)
методу, что довольно интуитивно 0
.
Комментарии:
1. Это поведение описано в
String#to_i
документах API. @2017kamb Всегда полезно прочитать документы API, если вас смущает поведение метода.2. И наоборот,
'54thousand'.to_i(36)
возвращает 521,395,291,927,273, потому что он фактически интерпретирует все символы как базовые 36 цифр.
Ответ №2:
base
другими словами, Radix означает количество уникальных цифр в системе счисления.
В десятичной системе счисления у нас есть 0
to 9
, 10 цифр для представления чисел.
Вы используете 2
в качестве параметра, что означает двоичный код, поэтому работают только 0
и 1
.
Из документа to_i:
Возвращает результат интерпретации начальных символов в
str
как целочисленное базовое значение (от 2 до 36). Посторонние символы после конца допустимого числа игнорируются. Если в начале не указано допустимое числоstr
,0
возвращается. Этот метод никогда не создает исключение, когда база допустима.
Вы можете использовать эти числовые представления непосредственно в Ruby:
num_hex = 0x100
#=> 256
num_bin = 0b100
#=> 4
num_oct = 0o100
#=> 64
num_dec = 0d100
#=> 100