24 lines
495 B
Ruby
24 lines
495 B
Ruby
require 'bigdecimal'
|
|
require 'bigdecimal/util' # String#to_d
|
|
|
|
def safe_add(a, b, prec)
|
|
a, b = a.to_d, b.to_d
|
|
rm = BigDecimal::ROUND_MODE
|
|
orig = BigDecimal.mode(rm)
|
|
|
|
BigDecimal.mode(rm, BigDecimal::ROUND_FLOOR)
|
|
low = a.add(b, prec)
|
|
|
|
BigDecimal.mode(rm, BigDecimal::ROUND_CEILING)
|
|
high = a.add(b, prec)
|
|
|
|
BigDecimal.mode(rm, orig)
|
|
low..high
|
|
end
|
|
|
|
[["1", "2"],
|
|
["0.1", "0.2"],
|
|
["0.1", "0.00002"],
|
|
["0.1", "-0.00002"],
|
|
].each { |a, b| puts "#{a} + #{b} = #{safe_add(a, b, 3)}" }
|