Ruby BigDecimal Вокруг: действительно ли это - ошибка?

При записи теста со значением, которое представлено как BigDecimal, я столкнулся с чем-то странным и решительным для рытья в него. Короче говоря, '0.00009' при округлении к двум десятичным разрядам возвращается как 0,01 вместо 0,00. Действительно. Вот мое получение сценария/консоли:

>> 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

Кто-либо видел что-нибудь как это?

9
задан John Topley 13 January 2010 в 08:54
поделиться

2 ответа

Нет, никогда не видел этого раньше, и это определенно выглядит как ошибка. 0,00009 Округленные до двух десятичных знаков должны определенно быть 0,00 .

Round_half_down не должен изменять поведение, поскольку вы не имеете дело с значениями средней точки.

Эта ссылка имеет более подробную информацию.

Кажется, что это ошибка на уровне 1,8, которые были зафиксированы в 1.9. Это слегка причудливый в том, что он, кажется, влияет только с четным количеством нулей перед первой ненулевой цифрой, и только если эта цифра 5 или выше.

Это, кажется, точно ваша проблема, основанная на предоставленных данных.

6
ответ дан 4 December 2019 в 23:39
поделиться

Я думаю, это тоже ошибка, но меня интересует .to_f для отображения результата. С BigDecimal вы должны использовать вместо этого .to_s ('F'), поскольку я думаю, у вас есть причина использовать BigDecimal вместо Floats.

0
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: