■No7911に返信(jeepさんの記事)
> jeepです。降参することにしました。
> (java.lang.Nullpoさん、せっかくアドバイス頂いたのにすみません。 )
私の責任でもありますので、汎用的な関数を作ってみました。
汎用的といいつつ、小数にしか対応してませんが(ダメじゃん)
適当な作りになってますので改造してください・・・。
(多分、小数の扱いで誤差が出ます)
また、有効桁以下も検証する必要がある場合は、係数が「0.999・・・」となるように工夫してください。
第1引数に、対象となる値 (通常は何らかの小数)
第2引数に、EnumFracのどれか (4つ用意してみました)
第3引数に、どこで端数処理するかを指定 ("0.00" とすれば小数第2まで有効)
private enum EnumFrac {
Kirisute = 1,
Kiriage = 2,
ShishaGonyu = 4,
GoshaRokunyu = 8
}
private static double EraseFraction(double vValue, EnumFrac uFrac, string nFormat) {
int iCoef = 1;
int iSign = 1;
int iPlace = 0;
int iLength = 0;
if (vValue == 0) {
return 0;
}
iPlace = nFormat.LastIndexOf('.');
if (iPlace >= 0) {
iLength = nFormat.Length - iPlace - 1;
for (int i = 0; i < iLength; i++) {
iCoef *= 10;
}
}
if (vValue < 0) {
vValue *= -1;
iSign = -1;
}
switch (uFrac) {
case EnumFrac.Kirisute: // 切り捨て
vValue = Math.Floor(vValue * iCoef) / iCoef;
break;
case EnumFrac.Kiriage: // 切り上げ
vValue = Math.Floor((vValue + ((double)(0.9 / iCoef))) * iCoef) / iCoef;
break;
case EnumFrac.ShishaGonyu: // 四捨五入
vValue = Math.Floor((vValue + (0.5 / iCoef)) * iCoef) / iCoef;
break;
case EnumFrac.GoshaRokunyu: // 五捨六入
vValue = Math.Floor((vValue + (0.4 / iCoef)) * iCoef) / iCoef;
break;
}
return vValue * iSign;
}
分類:[.NET]
Public Function Marume(num As Variant, keta As Variant, mode As Variant) As Variant
Dim kingaku As Variant
Dim shift As Variant
kingaku = CDec(num)
shift = CDec(10 ^ (keta + 1))
Marume = CDec(int((kingaku * shift + CDec(mode)) / 10) / CDec(shift / 10))