計算式『10/3*3』について


お世話になります。

アルゴリズムか言語特有の問題かが解らないのですが…

C#にて、スタックポインタを使用した、逆ポーランド法で式を計算するプログラムを  
書いているときですが、計算する変数はdecimalを使って、小数まで計算できる  
ようにしたのですが、表題のような計算式を入れると、計算結果が『10.0000000000000000』  
桁数は正確に数えたわけではないので、多分これくらいだったと思います。

これというのは、表示されてはいないものの、『ぴったり10ではない』ということなのでしょぅか。  
それとも、10として計算してはいるけれど、直前の計算で10/3=3.333333333...  
としてしまっているため、その時の桁数通りに扱われているということなのでしょうか。

行いたいことは、当然『10』として結果を得たいのです。いくら数的に10であっても、  
できれば小数点以下は表示させたくありません。もちろん、表示する時点に数値を  
調べ、小数点以下が0ならば小数点から下は表示しないと言った文字列操作で  
できなくはないですが、あまり解決策としてはよくありません。  
このように、『小数点でも割り切れない値』というものを、正しい値のまま  
扱うことはできますでしょうか。

対策方法を教えてください。  
お願いいたします。




１０／３は、循環小数（3.33333…が無限に続く）なので、メモリが有限であるので、(コンピュータで)小数を使って正確に数値を表すことはできません。（つまりどこかで丸めが生じる）。

計算上（無理数ではなく）こうした循環小数を扱う場合には、  
循環小数は、分数の形に変換できるので、  
数値計算を分子・分母のペア（つまり分数を内部表現として持つ）で扱う(計算を続けるうちに扱う数値が大きくなることが予想されるので、BigIntegerを使用する）ようにすれば、いいかと思います。




１０／３は、循環小数（3.33333…が無限に続く）なので、メモリが有限であるので、(コンピュータで)小数を使って正確に数値を表すことはできません。（つまりどこかで丸めが生じる）。

計算上（無理数ではなく）こうした循環小数を扱う場合には、  
循環小数は、分数の形に変換できるので、  
数値計算を分子・分母のペア（つまり分数を内部表現として持つ）で扱う(計算を続けるうちに扱う数値が大きくなることが予想されるので、BigIntegerを使用する）ようにすれば、いいかと思います。

