class ReeNumber::RoundHelper
def absolute_precision(number, significant, precision)
def absolute_precision(number, significant, precision) if significant && precision > 0 precision - digit_count(convert_to_decimal(number, precision)) else precision end end
def call(number, **opts)
def call(number, **opts) options = DEFAULTS.merge(opts) absolute_precision = absolute_precision( number, options[:significant], options[:precision] ) rounded_number = convert_to_decimal(number, options[:precision]).round(absolute_precision, options[:round_mode]) rounded_number = rounded_number.zero? ? rounded_number.abs : rounded_number end
def convert_to_decimal(number, precision)
def convert_to_decimal(number, precision) case number when Float, String, Integer BigDecimal(number.to_s) when Rational BigDecimal(number, digit_count(number.to_i) + precision) else number.to_d end end