C#プログラムで精度保持は必要なテクニックです。
// 整数での算術演算の場合、精度の高い型に変換(キャスト)して演算する
int M = 5 ;
int N = 3 ;
double X = M / N ; // 1 (小数点以下の情報が失われる)
double X = (double)(M / N) ; // 1 (小数点以下の情報が失われる)
double X = (double)M / (double)N ; // 1.666...(OK!)
型変換によらない精度保持
// 整数での算術演算の場合、演算の順番に注意する → 除算は最後に行う!
int L = 2 ;
int M = 4 ;
int N = 6 ;
int J = L / M * N ; // 0(NG:除算を先に行ってはダメ)
int K = L * N / M ; // 3(OK:乗算を先に行う)
// Note: 乗算と除算は、演算の優先順位が同じなので、上記の場合、左から順に
// 評価(計算)される。
型変換の悪い例
// 精度の低い型への暗黙的変換は行えない
long L = 123456 ;
int M ;
int N ;
M = L ; // コンパイルエラーが発生!(精度の低い型への暗黙的変換)
N = (int)L ; // コンパイル OK! (精度の低い型への明示的変換)
-----------------------------------------------------------------------
// 精度の低い型への明示的変換でも注意が必要
long L = 123456789012 ;
int N ;
N = (int)L ; // -1097262572intの表現範囲値を超えているので変な結果になる!)
内部変換誤差の蓄積
// 0.0001を10000回加算すると、ぴったり1になるか?→浮動小数点ではNG!
float X = 0 ; // 32 bit 浮動小数点 型(有効桁 約 7 桁)
double Y = 0 ; // 64 bit 浮動小数点 型(有効桁 約 16 桁)
decimal Z = 0 ; // 固定小数点 型 (有効桁 約 29 桁)
for (int N = 1 ; N <= 10000 ; N ++)
{
X += 0.0001f ; // 結果 1.000054
Y += 0.0001 ; // 結果 0.999999999999906
Z += 0.0001m ; // 結果 1
}
// Note: decimal型では内部変換誤差は発生しないが、浮動小数点型では
/ 内部変換誤差が発生することがあるので、注意すること!
トップページ
> 特殊文字とは
> 起動時のパラメータ取得方法
> C#プログラミング文字列を連結する方法
> C#でのファイルの書き込み
> 文字列の分割の方法
> C#のファイルパス名文字列から、ファイル名や拡張子を抜きだす方法
> C#文字列扱いの方法etc
> ダイアログで複数ファイル名を読む方法
> 動的配列の取り方
> チェックリストボックスでチェックされたものを調べる方法
> C#ファイルからの入力
> 文字列の検索方法
> 四捨五入する方法
> 小数点操作のいろいろ
> 型変換による精度保持の方法
> 内部変換誤差のお話
> C#で数値を文字列に変換する方法
> 算術演算 (関数) の記述
> C#ファイルの移動
> C#フォームをアクティブにする方法
> Formを必ず最前面に移動しその Form にフォーカスを移動する
> C#で時間差表示する方法
> Form の多重起動を防ぐ
> Form を最前面に\配置
> Formを自動で閉じる
> VisualStudioでセットアップモジュールを作る方法
> *
> *
> *
> (以下は用語説明文)
> .NET Framework