質問: お世話になります。 アルゴリズムか言語特有の問題かが解らないのですが... C#にて、スタックポインタを使用した、逆ポーランド法で式を計算するプログラムを 書いているときですが、計算する変数はdecimalを使って、小数まで計算できる ようにしたのですが、表題のような計算式を入れると、計算結果が『10.0000000000000000』 桁数は正確に数えたわけではないので、多分これくらいだったと思います。 これというのは、表示されてはいないものの、『ぴったり10ではない』ということなのでしょぅか。 それとも、10として計算してはいるけれど、直前の計算で10/3=3.333333333... としてしまっているため、その時の桁数通りに扱われているということなのでしょうか。 行いたいことは、当然『10』として結果を得たいのです。いくら数的に10であっても、 できれば小数点以下は表示させたくありません。もちろん、表示する時点に数値を 調べ、小数点以下が0ならば小数点から下は表示しないと言った文字列操作で できなくはないですが、あまり解決策としてはよくありません。 このように、『小数点でも割り切れない値』というものを、正しい値のまま 扱うことはできますでしょうか。 対策方法を教えてください。 お願いいたします。
回答: 10/3は、循環小数(3.33333...が無限に続く)なので、メモリが有限であるので、(コンピュータで)小数を使って正確に数値を表すことはできません。(つまりどこかで丸めが生じる)。 計算上(無理数ではなく)こうした循環小数を扱う場合には、 循環小数は、分数の形に変換できるので、 数値計算を分子・分母のペア(つまり分数を内部表現として持つ)で扱う(計算を続けるうちに扱う数値が大きくなることが予想されるので、BigIntegerを使用する)ようにすれば、いいかと思います。