ruby-on-rails - Ruby BigDecimal 圆 : Is this an error?

标签 ruby-on-rails ruby bigdecimal rounding

在用一个表示为 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

有没有人见过这样的事情?

最佳答案

不,以前从未见过,它看起来确实像一个错误。 0.00009四舍五入到小数点后两位肯定是0.00

ROUND_HALF_DOWN 不应更改行为,因为您不处理中点值。

This link有更多详细信息。

这似乎是 1.8 级别中的错误,已在 1.9 中修复。这是一个有点奇怪的问题,因为它似乎只影响在第一个非零数字之前具有偶数个零的数字,并且仅当该数字为 5 或更大时。

根据所提供的数据,这似乎正是您的问题。

关于ruby-on-rails - Ruby BigDecimal 圆 : Is this an error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2053998/

相关文章:

ruby-on-rails - jekyll ruby​​ 上的 kramdown coderay syntax_highlighter

ruby-on-rails - 不区分大小写 default_scope :order?

Ruby - Digest::Digest 已弃用;使用摘要

ruby-on-rails - rails 3 : Rendering certain attributes of an array of objects in JSON

ruby-on-rails - 如何从 Rails Observer/Model 调用 expire_fragment?

ruby - 在没有参数的情况下运行 ruby​​ 时我没有收到提示

javascript - 使用 Ruby on Rails 进行 HTML5 文件拖放上传

java - bigdecimal 减法结果为指数

java - 算术异常: "Non-terminating decimal expansion; no exact representable decimal result"

java - BigDecimal,setScale 问题