- PR -

小数点第6桁目での切り捨て

1
投稿者投稿内容
常連さん
会議室デビュー日: 2004/05/17
投稿数: 23
投稿日時: 2005-07-08 20:04
お世話になってます。

以下の仕様でデータを作成していますが、上手く行きません。
どなたかよい知恵がありましたら、よろしくお願いいたします。

総トータル数と個数を入力し、それを各個数分に等分します。
但し、割り切れない場合は、一番最初の値に余り分を上乗せします。
小数点6桁目まで値を求めます。

例:総トータル 1
  個数 3

想定している結果
1つ目 0.333334
2つ目 0.333333
3つ目 0.333333

下記プログラムで実行すると余りが正しく出ず 計算がおかしくなります
ここから-----------------------------------------------------------------------
dblTotal = Cdbl(StrTotal)
dblKosuu = Cdbl(StrKosuu)
dblKobetusuu = Fnc_Round(Cstr(StrTotal / StrKosuu))
if index = 1 then
dblBuf = Cdbl(dblKobetusuu * dblKosuu)
dblBuf2 = dblTotal - dblBuf
dblKobetusuu = dblKobetusuu + dblMid
End if
ここまで-----------------------------------------------------------------------

Fnc_Round関数は自分で作成した関数で 数値型を1度String型にして 小数点第6桁目までを求め、また数値型で戻しています。

上記ですと余りが正しく求められません
ログで見ると結果が以下のようになってします。
総容量 (5.55)
個数 (6)
ケース毎の容量 (0.925)
ケース容量×ケース数 (5.55)
余り (-8.88178419700125E-16)

このため正しく上記のような想定してるデータが作成できません。

申し訳ありませんが、良い計算方法がありましたら、お教えいただけないでしょうか?



ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-07-08 21:01
小数点以下6桁までの固定小数点演算ですね。そういう場合、スケーリングして整数で計算する方法を普通使います(6桁までなので10^6倍してすべての計算を行う)。

参考に、C#ですがコードおいときますね。

コード:


const int scale = 1000000; // 10^6
int total_hat = total * scale;
int[] result_hat = new int[kosuu];
decimal[] result = new decimal[kosuu];

for(int n=0;n<kosuu;n++) {
 result_hat[n] = (n==0) ?
  total_hat/kosuu + total_hat%kosuu :
  total_hat/kosuu;
}

for(int m=0;m<kosuu;m++) {
 result[m] = ((decimal)result_hat[m]) / ((decimal)scale);
}




[ メッセージ編集済み 編集者: ya 編集日時 2005-07-08 21:03 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-08 23:33
それか、decimal型を使う。
_________________
常連さん
会議室デビュー日: 2004/05/17
投稿数: 23
投稿日時: 2005-07-11 14:17
ありがとうございました。
想定している結果が出せるようになりました。
1

スキルアップ/キャリアアップ(JOB@IT)