BigDecimal#round returns different types depending on argument
BigDecimal#round returns Integer when no arguments are given and BigDecimal otherwise. I would have assumed the result to always be BigDecimal.
BigDecimal.new('12.34').round # => 12 (Integer)
BigDecimal.new('12.34').round(0) # => 12 (BigDecimal)
Attached is a patch with possible fix.
I found a similar issue to this one (https://bugs.ruby-lang.org/issues/2662), but it's in Japanese. If this should be rejected as well could someone provide an explanation in English please? Also in that case documentation should be changed as it clearly states that the result should be BigDecimal: "Round to the nearest integer (by default), returning the result as a BigDecimal."
Updated by mrkn (Kenta Murata) almost 3 years ago
Float#round returns Fixnum value when the argument is
0 or omitted.
irb(main):005:0> 12.34.round.class => Fixnum irb(main):006:0> 12.34.round(0).class => Fixnum
If we will fix
BigDecimal#round, we should change the return value for the case of the argument
0 is supplied.
Updated by shyouhei (Shyouhei Urabe) over 2 years ago
We (mainly mrkn and matz) discussed why Fixnum#round returns Integer today. The answer is because (unlike other languages, namely C's round(3)) in ruby we can safely store all possible return value that round can theoretically generate, in Integer.
BigDecimal#round's returning BigDecimal instance sounds nice. But matz said he need to think a while for this historic Float behaviour.