2014-01-27 4 views
0

У меня возник вопрос о том, как R обрабатывает двойные, числовые и символьные типы данных внутри.Двойные цифры в R

Моя проблема возникает из этого фрагмента кода:

dn <- 1.0 
dc <- "1.0" 
dn == dc # FALSE 
dn # 1 
as.double(dc) # 1 

Проблема в том, я ожидал двойной, чтобы сохранить форматирование, цифры после запятой, вместо того, чтобы сократить таким зверским способом, что делает его трудно сравнить его с версией персонажа того же числа. Конечно, проблемы нет с цифрами вроде 16.2, для которых форматирование правильно сохраняется.

Есть ли способ сделать «двойное» форматирование продолжительным?

Большое спасибо

+2

вы спрашиваете о форматировании при выводе чисел? если да, см. '? format'. Или вы спрашиваете о точности машины? В этом случае вы хотите 'all.equal (as.numeric (dc), dn)' –

+0

ORLY? В чем разница между «16.2» и «16.20000»? Но более того, нет такой вещи, как «версия персонажа» для числа. –

+0

оба 'sprintf ("%. 1f ", dn) == dc' и' dn == as.double (dc) 'имеют значение TRUE. Вы не можете рассчитывать сравнить число со строкой и надеяться, что это будет оцениваться как TRUE. –

ответ

1
dn <- 1.0 
sprintf("%.1f",dn) 
# [1] "1.0" 
sprintf("%.2f",dn) 
# [1] "1.00" 
sprintf("%.22f",dn) 
# [1] "1.0000000000000000000000" 

dc == sprintf("%.1f",dn) 
#[1] TRUE 

dn хранится как двойной точности поплавок ("числовой" в R). Как вы это видите, зависит от вас.

+0

Хорошо, моя проблема была только «1.0» == 1.0 -> FALSE, потому что казалось, что он сделал внутреннюю конверсию, переводящую double в целое число –

Смежные вопросы