■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))