У меня проблема с преобразованием длинного числа в строку в R. Как легко преобразовать число в строку, чтобы сохранить точность?Есть простой пример ниже.
a = -8664354335142704128
toString(a)
[1] "-8664354335142704128"
b = -8664354335142703762
toString(b)
[1] "-8664354335142704128"
a == b
[1] TRUE
Я ожидал toString(a)
== toString(b)
, но получил другие значения.Я полагаю, toString()
преобразует число в число с плавающей точкой или что-то подобное, прежде чем преобразовать в строку.
Спасибо за вашу помощь.
Редактировать:
> -8664354335142704128 == -8664354335142703762
[1] TRUE
> along = bit64::as.integer64(-8664354335142704128)
> blong = bit64::as.integer64(-8664354335142703762)
> along == blong
[1] TRUE
> blong
integer64
[1] -8664354335142704128
Я также пытался:
> as.character(blong)
[1] "-8664354335142704128"
> sprintf("%f", -8664354335142703762)
[1] "-8664354335142704128.000000"
> sprintf("%f", blong)
[1] "-0.000000"
Редактировать 2:
Сначала я спросил, могу ли я преобразовать длинное число в строку без потерь.Тогда я понял, что в R невозможно получить действительное значение длинного числа, переданного в функцию, потому что R автоматически считывает значение с потерей.
Например, у меня есть функция:
> my_function <- function(long_number){
+ string_number <- toString(long_number)
+ print(string_number)
+ }
Если кто-то использовал его и передал длинный номер, я не смогу получить информацию, какой номер был передан точно.
> my_function(-8664354335142703762)
[1] "-8664354335142704128"
Например, если я читаю некоторые цифры из файла, это легко.Но это не мой случай.Мне просто нужно использовать то, что пропустил какой-то пользователь.
Я не эксперт по R, поэтому мне было любопытно, почему на другом языке это работает, а в R - нет.Например, в Python:
>>> def my_function(long_number):
... string_number = str(long_number)
... print(string_number)
...
>>> my_function(-8664354335142703762)
-8664354335142703762
Теперь я знаю, проблема в том, как R читает и сохраняет числа.Каждый язык может сделать это по-своему.Я должен изменить способ передачи чисел в функцию R, и это решает мою проблему.
Поэтому правильный ответ на мой вопрос:
«« Я полагаю, toString () преобразует число в число с плавающей точкой », нет, вы сделали это сами (даже если непреднамеренно).» - Нет, R сделал это сам, именно так R читает числа.
Поэтому я отметил ответ r2evans как лучший ответ, потому что этот пользователь помог мне найти правильное решение.Спасибо!