From: Yusuke ENDOH Date: 2010-02-07T16:06:28+09:00 Subject: [ruby-dev:40340] Re: patch for ruby-core:17472 遠藤です。 2008年7月7日18:23 wanabe : > 2008/07/06 15:36 Nobuyoshi Nakada : >> BigDecimal('1').div(BigDecimal('3E-9')) の結果の有効数字が一桁に >> なるというのは、もしかして仕様どおりの動作なんじゃないでしょうか。 >> 左辺も右辺も、(あるいはレシーバも引数も)有効数字一桁ですから。 > > ありがとうございます。なるほど。 > > BigDecimal('1').divmod(BigDecimal('3E-9')) #=> [0.3E9, 0.1E0] > > 上のように余りが割る数を上回るのが理解できず > バグかと思ったのですが、そういうことでしたら納得しました。 これはやはりバグだと思います。 こんなこと本当は言いたくないのですが、本当に残念なことに bigdecimal は Java の BigDecimal に基づいた実装になってしまっています。 そして Java の BigDecimal は、常識的な「有効数字」とは異なる思想に 基づいているようです (加減算などが「有効数字」を勝手に増やすのも仕様) 。 http://java.sun.com/javase/ja/6/docs/ja/api/java/math/BigDecimal.html 一刻も早く bigdecimal を投げ捨てたい。 そして、その Java においても divideAndRemainder は 333.. を返します。 scala> new BigDecimal("1") divideAndRemainder new BigDecimal("3E-9") res0: Array[java.math.BigDecimal] = Array(333333333, 1E-9) よってこのパッチはあてるべきです。rubyspec のエラーも消えます。 ワナベさん、お願いしていいでしょうか。 -- Yusuke ENDOH