2016-11-10 21 views
1

Rubyで非常に基本的な10進数計算を行っています(x = 1/b * c)Ruby BigDecimal丸め誤差

a = BigDecimal.new("1"); 
b = BigDecimal.new("0.8903"); 
c = BigDecimal.new("0.8903"); 
x = a/b * c; 
puts x 

出力:0.9999999998379

は、しかし元の式を並べ替える:0.9999999998379

が、私はちょうど1小数(x = 1/b * b)

a = BigDecimal.new("1"); 
b = BigDecimal.new("0.8903"); 
x = a/b * b; 
puts x 

出力にテストケースを単純化してきた問題を除外するためにが正しい答えを返します。

a = BigDecimal.new("1"); 
b = BigDecimal.new("0.8903"); 
c = BigDecimal.new("0.8903"); 
x = c/b; 
puts x 

出力:1.0

任意のアイデアこれはBigDecimalのバグであるかどうかこれかの原因何?

浮動小数点数の問題を教えてくれてありがとう、BigDecimalにも同じ問題がない限り、私は浮動小数点数を使用していません。

+0

@AndrewLiが –

答えて

1

これは、新しいBigDecimalオブジェクトの最大桁数の制限と関係があります。

制限を4に設定すると、数式が正しく処理されます。

a = BigDecimal.new("1"); 
b = BigDecimal.new("0.8903"); 
c = BigDecimal.new("0.8903"); 
x = a.div(b, 4) * c; 
puts x 

出力:0.8903

あなたが制限についての詳細を見つけることができますなぜ私はBigDecimalのを使用していますhere

+0

を浮いていないそれは11年ではありませんいくつかのドキュメントにリンクする価値があるかもしれませんold:https://ruby-doc.org/stdlib-2.3.1/libdoc/bigdecimal/rdoc/BigDecimal.html –

+0

私は、ここで起こっていることの基本は、リンクされている他の答えで解決されていることに同意します。参照リンクは、Rubyの数学のための小数点以下の桁数を制限する必要があることを前提としていました仕事はまだ同じです。小数点の後に一貫した数の場所が分かっていれば、BigDecimalで計算を正しく行うことができます。 –