В библиотеке ядра Ruby существует очень полезный класс Set
. Он может хранить любой тип объекта.Сохранение чисел с плавающей запятой в Set?
Но, как вы знаете, числа с плавающей запятой (Float
в Ruby) имеют некоторые проблемы с точностью. 1.2-1.0
не соответствует 0.2
.
s = Set.new()
s.add(1.2-1.0)
s.add(0.2)
s.size
=> 2
Да, я могу использовать BigDecimal
типа, чтобы получить точные цифры. Но можно ли дать Set
конкретную функцию сравнения, чтобы она могла выдержать небольшую ошибку (например, 1e-9
)?
(я знаю, что эта проблема является независимым от языка. Добро пожаловать решения в других распространенных языках)
Семантика является проблематичной. Предположим, что у вас уже есть '1.0' и' 1.0 + 1.5e-9' в вашем наборе, при этом допустимая ошибка установлена в '1e-9'. Теперь что происходит, когда вы добавляете '1.0 + 0.7e-9'? Уходит ли набор из 2 элементов в 1? –