2014-12-11 2 views
2

Я хотел бы преобразовать приведенные ниже символьные данные в числовые данные. Но as.numeric обрезает некоторую информацию. Как я могу гарантировать, что я получу 1.00000000000000000000000000000001 после преобразования в числовой?Преобразование символа в числовое без потери информации

> a="1.00000000000000000000000000000001" 
> as.numeric(a) 
[1] 1 
> as.numeric(a,10) 
[1] 1 
> as.numeric(as.character(a)) 
[1] 1 
> as.double(a) 
[1] 1 
+4

Это один из наиболее часто задаваемых вопросов о SO. Прежде всего, вам нужно узнать разницу между сохраненным значением и отображаемой точностью (которое в 'R' можно настроить с помощью таких вещей, как' options'). Во-вторых, вам нужно узнать о точности машины и о том, как числа с плавающей запятой хранятся в двоичных цифровых компьютерах. Например, 'a =" 1.00000000000001 " sprintf ('% 1.20f', as.numeric (a)) [1]" 1.00000000000000999201 "" В-третьих, проверьте предел точности значений с плавающей запятой. –

ответ

2

Это не проблема с as.character, но с ограничениями численной точности:

> a <- 1.00000000000000000000000000000001 
> a == 1 
[1] TRUE 
3

Если вам нужно отнести то, что много точности, рассмотрит пакет Rmpfr

library(Rmpfr) 
longa<-mpfr("1.00000000000000000000000000000001",200) 
longa 
1 'mpfr' number of precision 200 bits 
[1] 1.0000000000000000000000000000000100000000000000000000000000004 

Обратите внимание, что даже здесь есть небольшая ошибка 4x10-[bignumber].

попробовать что-то любитель:

mpfr("1.00000000000000000000000000000001e50",200) 
1 'mpfr' number of precision 200 bits 
[1] 100000000000000000000000000000001000000000000000000 #is an integer, so no error 
mpfr("1.00000000000000000000000000000001e50",200)/1e50 
1 'mpfr' number of precision 200 bits 
[1] 0.99999999999999992370230158908114578838913309406505827306768701 

Что я указывая, что вам нужно быть очень осторожными при работе с числами с плавающей точкой на компьютерах.

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