Trong khi viết một bài kiểm tra với một giá trị được đại diện như một BigDecimal, tôi chạy vào một cái gì đó kỳ lạ và quyết định đào sâu vào nó. Tóm lại, '0.00009' khi được làm tròn đến hai chữ số thập phân được trả về là 0,01 thay vì 0,00. Có thật không. Dưới đây là tôi kịch bản/console chụp:Vòng BigDecimal của Ruby: Đây có phải là lỗi không?
>> 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, và tôi nhận được kết quả tương tự nếu tôi sử dụng chế độ mặc định, như vậy:
>> bd = BigDecimal('0.00009')
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)>
>> bd.round(2).to_f
=> 0.01
Dưới đây là phiên bản của tôi:
ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2]
Rails 2.3.4
Có ai nhìn thấy bất cứ điều gì như thế này không?
Tôi không thể tái tạo nó trong môi trường 1.8.7 của tôi (ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]) – bryantsai