A coworker discovered some disturbing behavior in BigDecimal#round.
The output I get from the program below is:
===== begin output
These values appended to ‘0.0000’ cause BigDecimal#round to return
nonzero:
[5, 6, 7, 8, 9, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99]
These numbers of zeroes between the decimal point and a 7 cause
BigDecimal#round to return nonzero:
[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72,
76, 80, 84, 88, 92, 96, 100]
===== end output
===== begin code
require ‘bigdecimal’
vary_number_after_four_zeroes = (1…100).map { |i|
bd = BigDecimal.new(“0.0000#{i}”); [i, bd.round.to_s]
}
seed_values_triggering_misbehavior_with_four_zeroes =
vary_number_after_four_zeroes.reject {|i, bds| bds == ‘0.0’}.map {|
i, bds| i}
vary_number_of_zeroes = (1…100).map { |i|
bd = BigDecimal.new(“0.#{‘0’ * i}7”); [i, bd.round.to_s]
}
number_of_zeroes_triggering_misbehavior =
vary_number_of_zeroes.reject {|i, bds| bds == ‘0.0’}.map {|i, bds|
i}
puts “These values appended to ‘0.0000’ cause BigDecimal#round to
return nonzero:”
p seed_values_triggering_misbehavior_with_four_zeroes
puts
puts “These numbers of zeroes between the decimal point and a 7 cause
BigDecimal#round to return nonzero:”
p number_of_zeroes_triggering_misbehavior
===== end code
I get identical reports on Linux and Windows versions of Ruby:
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux]
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
We would be grateful for a pointer to a patch that fixes this issue if
one is available.