2010-01-13 28 views
8

Bir BigDecimal olarak temsil edilen bir değerle bir test yazarken garip bir şeyle karşılaştım ve kazmaya karar verdim. Kısaca, iki ondalık basamağa yuvarlandığında '0.00009', 0.00 yerine 0.01 olarak döndürülür. Gerçekten mi. İşte benim komut/konsol yakalama var:Ruby BigDecimal Round: Bu bir hata mı?

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

Oh, ve varsayılan modunu kullanmak eğer şöyle, aynı sonuçları elde:

ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2] 
Rails 2.3.4 
: Burada
>> bd = BigDecimal('0.00009') 
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)> 
>> bd.round(2).to_f 
=> 0.01 

benim sürümleridir

Böyle bir şey gören oldu mu?

+0

Bunu 1.8.7 ortamımda yeniden üretemiyorum (ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]) – bryantsai

cevap

6

Hayır, bunu daha önce hiç görmedim ve kesinlikle bir böcek gibi görünüyor. İki ondalık basamağa yuvarlanmış 0.00009 kesinlikle 0.00 olmalıdır. Eğer orta nokta değerlerle ilgili değiliz beri

ROUND_HALF_DOWN davranışını değiştirmemelidir.

This link, daha fazla ayrıntıya sahiptir.

1.9'da düzeltilen 1.8 seviyesinde bir hata gibi görünüyor. Bu biraz tuhaf bir şey, sadece sıfır olmayan ilk rakamdan önce sıfır sayıda sayıları ve sadece bu rakam 5 veya daha büyükse sayıları etkiliyor gibi görünüyor. belirir

olmak tam sağlanan verilere dayalı olarak sorunun.

+0

Evet, bu tam olarak benim sorunum gibi görünüyor! Huzur için teşekkürler! –

0

Ben bu da bir hata olduğunu düşünüyorum, ama ne merak sonucu görüntülemek için .to_f olduğunu. BigDecimal ile .to_s ('F') yerine, Floats yerine BigDecimal kullanmak için bir nedeniniz olduğunu düşündüğümden bunun yerine kullanmalısınız.

İlgili konular