C#で小数点以下を扱う型

C#で、小数点以下を扱う必要がある時、どんな型を使えば良いのでしょうか。
C#での基本型の多くは、整数型です。byte,int,ulongなどいろいろありますね。
float,double型は、内部的には2進数の浮動小数点型です。
これは、 a * 2^e で表せる数です。
小数以下は、2^-1 , 2^-2 とかを掛けて作ります。
その結果、1.5や、0.25は正確に表すことができますが、0.1は正確に表現できなくて、誤差が発生します。
次に、decimalという型があります。これは、10進数の浮動小数点型です。
なぜか、「c# decimal」でググると、decimalは固定小数点型との説明が散見されますが、まあ、誤記でしょうね。
decimal は内部的に、 a * 10^e で数値を管理するため、1.3や0.12345みたいな数値を正確に再現できます。

doubleは、CPUがdouble用の演算器を持っていることが多く、複雑な割にかなり速く演算ができたりします。
decimalは16byteと、doubleの8byteとくらべ長い上に、CPUの特殊支援もなく、まあ、遅いです。10倍くらい遅いです。

さて、小数点を扱う時、科学演算とかはfloatかdoubleを使うみたいですね。
一般人が縁がありそうなケースだと、長さ(cm単位の時のmmとか)、お金あたりが多いでしょうか。
私だと、ビットコインの量で小数点以下を良く使います。

私の場合、小数点以下の誤差はつらくて、でもdecimalの遅さもつらくて。もうどうしたらいいのかと。
ということで、ちょっと話が変わって、コンピューター一般論に移りますと、固定小数点って概念があるんですよね。
これをC#でのshortを例にちょっと説明してい見ます。
shortは、-32,768 ~ 32,767を扱うことができます。
このshortで、小数点以下2桁を扱うと決めるわけです。
すると、shortの値が1000の時に10.00、shortの値が123の時に、1.23を表しているとして扱えます。
-327.68 ~ 327.67の範囲を扱えることになります。
この考え方が固定小数点型です。
で、100倍したり、100で割ったりして使うと、面倒だし、間違えるし、良い事ないので、上手い事やってくれる、内部にshortを持つstructを作っておくと便利に使えるわけです。

さて、こんな経緯があって、ちょっと固定小数点の型を鋭意作成中です。
内部にlongを持つ、小数点以下8桁を扱える固定小数点型 FixedPoint8です。
完成したら、公開しようと思いますので、乞うご期待ください。

投稿日:
カテゴリー: C#

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です