代码之家  ›  专栏  ›  技术社区  ›  Samuel Chandra

错误的ruby float和bigdecimal减法结果

  •  0
  • Samuel Chandra  · 技术社区  · 16 年前

    我在跑步:

    [~/ruby/rails/sas]$ ruby --version
    ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]
    

    Mac雪豹10.6.3

    有人能解释一下为什么浮点和bigdecimal减法会是这样的错误吗?

    [~/ruby/rails/sas]$ console
    Loading development environment (Rails 2.1.1)
    >> num = 30.0
    => 30.0
    >> num.class
    => Float
    >> ex = 28.04.to_d
    => #<BigDecimal:105367e40,'0.284E2',8(8)>
    >> ex.class
    => BigDecimal
    >> num - ex
    => 1.6
    >> _.class
    => Float
    >> 
    

    我希望结果应该是1.96,我知道也许不建议使用两种不同的数据类型进行算术运算,但这种行为是如此奇怪。

    从现在起,在进行任何算术运算之前,我必须检查变量的数据类型,这似乎是明智的。

    希望有人能告诉我发生了什么。

    2 回复  |  直到 16 年前
        1
  •  3
  •   John Topley    16 年前

    问题在于 to_d 轨道2.1.1中的方法。我尝试过

    ex = BigDecimal.new '28.04'
    #=> #<BigDecimal:1209328,'0.2804E2',8(8)>
    

    和轨道2.3.5

     ex = 28.04.to_d
     #=> #<BigDecimal:219ea18,'0.2804E2',8(8)>
    

    和 NEX-EX α=gt;1.96

    工作精细

    因此,您有三个选项,要么升级您的Rails版本,要么重写to-d方法,要么只使用 BigDecimal.new '28.04' 而不是 托德

        2
  •  0
  •   Samuel Chandra    16 年前

    问题是 不 Rails 2.1.1,因为我用相同的结果尝试了Rails 2.3.8

    [~/ruby/rails/sample_2.3.8]$ script/console
    Loading development environment (Rails 2.3.8)
    >> BigDecimal("28.04")
    => #<BigDecimal:1033eccc8,'0.284E2',8(8)>
    >> 
    

    我非常肯定问题出在Ruby1.8.7p173上,它是雪豹10.6.3的标准配置,如下所示:

    http://redmine.ruby-lang.org/issues/show/1910