C#で通貨計算に最適なデータ型は?decimal型の特徴と使い方を解説
C#で通貨を扱う際に最も適したデータ型はdecimalです。decimalは128ビットのデータ型であり、金融計算や金額計算向けに設計されています。表現できる値の範囲は約1.0 × 10-28から7.9 × 1028までで、有効桁数は28~29桁に及びます。decimal変数を初期化する際には、リテラルに「m」または「M」のサフィックスを付ける必要があります。
decimal b = 2.1m;
以下の例では、decimal型が取り得る最小値と最大値を表示しています。
サンプルコード
using System;
namespace DemoApplication{
public class Program{
public static void Main(){
Console.WriteLine($"Decimal Min Value: {decimal.MinValue}");
Console.WriteLine($"Decimal Max Value: {decimal.MaxValue}");
Console.ReadLine();
}
}
}
実行結果
Decimal Min Value: -79228162514264337593543950335 Decimal Max Value: 79228162514264337593543950335
decimal型の内部構造
decimal型が取り得る値の有限集合は、(-1)s × c × 10-eという形式で表されます。ここで符号sは0または1、係数cは0 ≤ c < 296、スケールeは0 ≤ e ≤ 28の範囲にあります。なお、decimal型は符号付きゼロ、無限大、NaN(非数)をサポートしていません。内部的には、10のべき乗でスケーリングされた96ビット整数として表現されます。
絶対値が1.0m未満のdecimalの場合、その値は小数第28位まで正確に表現されます。一方、絶対値が1.0m以上の場合は、28または29桁まで正確に表現できます。
floatやdoubleとの違い
float型やdouble型と異なり、0.1のような10進小数をdecimalでは正確に表現できます。floatやdoubleの内部表現では、このような数値は無限小数となることが多く、丸め誤差が発生しやすくなります。金額計算ではわずかな誤差が重大な問題につながる可能性があるため、これらの誤差は避けなければなりません。
このように、decimal型はfloatやdoubleと比較して高い精度を持つ一方、表現できる値の範囲は狭くなっています。そのため、金銭に関わる計算にはdecimal型の使用が強く推奨されます。
応用例:通貨換算
ここで、米ドル(USD)をインドルピー(INR)に換算する具体例を見てみましょう。
using System;
namespace DemoApplication{
public class Program{
public static void Main(){
decimal usd = 2.5m;
Console.WriteLine($"USD: {usd}");
decimal inrOfOneUSD = 75.04m;
Console.WriteLine($"INR value of one USD: {inrOfOneUSD}");
decimal inr = usd * inrOfOneUSD;
Console.WriteLine($"INR value: {inr}");
Console.ReadLine();
}
}
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
USD: 2.5 INR value of one USD: 75.04 INR value: 187.600
-
データ分析とは?基本の流れと目的別におすすめのツールを徹底解説
データ分析と聞くと、多くの人がMicrosoft Excelでデータを操作・集計するイメージを思い浮かべるかもしれません。しかし実際には、データ分析は単一のツールにとどまらず、多様なツールや手法を駆使して、データが語る「物語」を読み解く幅広い活動を指します。 では、データ分析とは何でしょうか。ビジネスデータ、製造データ、マーケティングデータなど、扱う対象によってその活用方法は大きく異なります。自社の業種や業務に特化したデータの分析も求められます。 本記事では、データ分析の各側面、それぞれの意味、そして一般的な活用方法について詳しく解説します。 データ収集 あらゆるデータ分析の出発点
-
C#のデータ型とは?値型・参照型・ポインタ型の違いを徹底解説
C#のデータ型は、大きく分けて「値型(Value Type)」「参照型(Reference Type)」「ポインタ型(Pointer Type)」の3種類に分類されます。それぞれの仕組みと使い分けを理解することは、C#プログラミングの基礎として非常に重要です。本記事では、各データ型の特徴を一覧表付きでわかりやすく解説します。 値型(Value Types) 値型の変数には、データそのものが直接代入されます。すべての値型は System.ValueType クラスから派生しており、変数を別の変数に代入すると値がコピーされるため、元の変数には影響しません。 C#で利用できる主な値型は以下のとおりで