При написании теста со значением, которое представляется в виде BigDecimal, я столкнулся с чем-то странным и решил в него разобраться. Короче говоря, «0.00009» при округлении до двух знаков после запятой возвращается как 0,01 вместо 0,00. В самом деле. Вот мой сценарий/консоль захвата:Ruby BigDecimal Round: Это ошибка?
>> bp = BigDecimal('0.09')
=> #<BigDecimal:210fe08,'0.9E-1',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.09
>> bp = BigDecimal('0.009')
=> #<BigDecimal:210bcf4,'0.9E-2',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.0009')
=> #<BigDecimal:2107a8c,'0.9E-3',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0
>> bp = BigDecimal('0.00009')
=> #<BigDecimal:2103428,'0.9E-4',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.000009')
=> #<BigDecimal:20ff0f8,'0.9E-5',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0
О, и я получаю те же результаты, если я использую режим по умолчанию, например, так:
>> bd = BigDecimal('0.00009')
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)>
>> bd.round(2).to_f
=> 0.01
Вот мои варианты:
ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2]
Rails 2.3.4
Кто-нибудь видел что-нибудь подобное?
Я не могу воспроизвести его в своей среде 1.8.7 (ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]) – bryantsai