Ответ 1
Обновление: функция округления по умолчанию была удалена в текущей версии версии data.table(v1.9.7). См. Инструкции по установке для версии devel здесь.
Это также означает, что вы несете ответственность за понимание ограничений в представлении чисел с плавающей запятой и решении этой проблемы.
data.table существует уже давно. Мы использовали дело с ограничениями в представлениях с плавающей запятой, используя порог (например, base R, например, all.equal
). Однако он просто не работает, поскольку он должен быть адаптивным в зависимости от того, насколько велики сравниваемые числа. Эта серия статей является отличным чтением по этой теме и другим потенциальным проблемам.
Это повторяющаяся проблема, потому что: а) люди не понимают ограничений, или б) пороговое значение действительно не помогло их проблеме, означало, что люди все спрашивали здесь или размещали на странице проекта.
В то время как мы повторно реализовали заказ data.table для быстрого упорядочивания радиуса, мы воспользовались возможностью, чтобы предоставить альтернативный способ устранения проблемы и предоставить выход, если это окажется нежелательным (экспорт setNumericRounding
). С проблемой # 1642 заказ, вероятно, не требует округления удвоений (но это не так просто, так как порядок напрямую влияет на подмножества, основанные на бинарном поиске).
Фактическая проблема здесь заключается в группировке чисел с плавающей запятой, еще хуже, таких чисел, как в вашем случае. Это просто плохой выбор ИМХО.
Я могу думать о двух направлениях:
-
При группировке по столбцам, которые действительно удваиваются (в R, 1 является двойным, а не 1L, и эти случаи не имеют проблем), мы предоставляем предупреждение о том, что последние 2 байта округлены, и что люди должны читать
?setNumericRounding
. А также предложите использоватьbit64::integer64
. -
Удалите функциональность, позволяющую группировать операции по действительно двойным значениям или заставлять их фиксировать точность до определенных цифр, прежде чем продолжить. Я не могу думать о допустимой причине, по которой нужно было бы группировать числа с плавающей точкой действительно (хотелось бы услышать от людей, которые делают).
Что вряд ли произойдет, это возврат к проверкам на основе пороговых значений для определения того, какие двойники должны принадлежать к одной и той же группе.
Просто чтобы Q остался отвеченным, используйте setNumericRounding(0L)
.