質問: Decimal, Single と Double の違いについて違いおよび使い分け方を教えていただけませんか?
回答: 最大の違いは精度です。 * `Single` 32ビット、仮数23ビット、指数8ビット * `Double` 64ビット、仮数52ビット、指数11ビット * `Decimal` 128ビット、仮数96ビット、指数5ビット=10^(-28~0) 上記のとおり`Decimal`は指数が10進なので、2進に起因する誤差が発生しません。なのでDBの10進表現や金融計算に利用されます。 しかし`Single`と`Double`が.NET中間言語のネイティブ型であるのに対して、`Decimal`はカスタム構造体なのでパフォーマンスが悪いです。 対応ライブラリの面で言うと、多くの画像・3Dライブラリでは座標に最小サイズの`Single`を使用しています。また.NET4.6で導入される`System.Numerics.Vectors`も`Single`中心です。例外としてはWPFで`Double`が標準となっています。 一方`System.Math`や`System.Numerics.Complex`などの数学的な標準APIは`Double`がインターフェイスになっていることが多いです。これは精度(あるいはCPUの命令)を優先したためと思われます。 追記 .NETのプリミティブ型について コメントで言及したので追記しますが、.NETには仮想機械でサポートされているプリミティブ型というものがあります。具体的には * 整数(`Byte`, `SByte`, `Int16`, `UInt16`, `Int32`, `UInt32`, `Int64`, `UInt64`) * 実数(`Single`, `Double`) * ポインタ(`IntPtr`, `UIntPtr`) * `Boolean` * `Char` で、これらは中間言語(CIL)上でネイティブ数値型として扱われます。なのでC#やVB上でも演算は言語仕様の一部として扱われておりMSDNを参照しても一部の演算子が定義されていません。 一方`Decimal`は共通言語仕様(CLS)のプリミティブ型、つまり標準で入っているカスタム構造体という位置づけになります。これらはCILネイティブの型からUプリフィックス付の型と`SByte`を除外し、`Decimal`と`String`を加えたものです。ですので標準ライブラリを使用せずにビルドする場合でも`Decimal`を定義する必要はありません。(`String`は必要です)