C#開発日記(.NET FrameWork)|初心者から上級者まで|C#プログラミングでわからない事を解決する方法>型変換による精度保持の方法

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#開発日記(.NET FrameWork)|初心者から上級者まで|C#プログラミングでわからない事を解決する方法

トップページ
特殊文字とは
起動時のパラメータ取得方法
C#プログラミング文字列を連結する方法
C#でのファイルの書き込み
文字列の分割の方法
C#のファイルパス名文字列から、ファイル名や拡張子を抜きだす方法
C#文字列扱いの方法etc
ダイアログで複数ファイル名を読む方法
動的配列の取り方
チェックリストボックスでチェックされたものを調べる方法
C#ファイルからの入力
文字列の検索方法
四捨五入する方法
小数点操作のいろいろ
型変換による精度保持の方法
内部変換誤差のお話
C#で数値を文字列に変換する方法
算術演算 (関数) の記述
C#ファイルの移動
C#フォームをアクティブにする方法
Formを必ず最前面に移動しその Form にフォーカスを移動する
C#で時間差表示する方法
Form の多重起動を防ぐ
Form を最前面に\配置
Formを自動で閉じる
VisualStudioでセットアップモジュールを作る方法
*
*
*
(以下は用語説明文)
.NET Framework

その他

リンク集







inserted by FC2 system