DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB

  • 題名: VB
  • 著者: jeep
  • 日時: 2004/12/07 9:18:09
  • ID: 7891
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[C#]
分類:[.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))
JEEPです、大変失礼しました。

VBで書かれたまるめ計算のコードをC#に置き換えしたいのですが

> shift = CDec(10 ^ (keta + 1))
> Marume = CDec(int((kingaku * shift + CDec(mode)) / 10) / CDec(shift / 10))

特に

> shift = CDec(10 ^ (keta + 1))

の部分で悩んでおります。アドバイス頂けないでしょうか?
よろしくお願い致します。

なお、本プログラム作者であるSAKさんから転載許可を得ております。
  • 題名: Re[2]: VB
  • 著者: JEEP
  • 日時: 2004/12/07 10:00:13
  • ID: 7893
  • この記事の返信元:
  • この記事への返信:
    • [7894] Re[3]: VB java.lang.Nullpo 2004/12/07 10:12:39
  • ツリーを表示
たびたび申し訳ありません。

>> Marume = CDec(int((kingaku * shift + CDec(mode)) / 10) / CDec(shift / 10))

こっちのほうでした(^^;

失礼しました。
  • 題名: Re[3]: VB
  • 著者: java.lang.Nullpo
  • 日時: 2004/12/07 10:12:39
  • ID: 7894
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No7893に返信(JEEPさんの記事)
> たびたび申し訳ありません。

> > Marume = CDec(int((kingaku * shift + CDec(mode)) / 10) / CDec(shift / 10))

> こっちのほうでした(^^;
> 失礼しました。

「CDec」の代わりが判らないということでしょうか?
いえ、「何が」わからないのか明記されておりませんので。

# てっきり、「^」の代わりがわからないのかと、思ってましたが。

戻り値だけを考えると、

 CDec[VB] ≒ (Decimal)キャスト[C] ≒ Decimal.Parse("value")[FW]

かな。

# そのまま、ソースコードを乗せて「はいどうぞ」ではなくて、
# 個人的には、いくばくかやったコードを乗せた方がいいと思いますよ。
# 「Variant」は、何らかの型に変更しなくてはなりませんよね?
# この辺りは、既に変更されているハズですから・・・
jeepです。

> # そのまま、ソースコードを乗せて「はいどうぞ」ではなくて、
> # 個人的には、いくばくかやったコードを乗せた方がいいと思いますよ。
> # 「Variant」は、何らかの型に変更しなくてはなりませんよね?
> # この辺りは、既に変更されているハズですから・・・

確かにそうですね、失礼しました。
public double Marume(double num, int keta, double mode)
{

///注
/// modeは
/// 切上げなら9
///  切捨てなら0
///  四捨五入は5
///

double kingaku = new double();
decimal shift = new decimal();

shift=1;
for(int i=0; i<(int)(figure + 1); i++)
shift = (decimal)shift * 10;
double kekka = new double();
kekka = (kingaku * (double)shift + (double)mode)/10 / (double)shift / 10;

今、こういうコードでデバッグしています。
kekkaの値がVB版のリターン値Marumeとイコールにならないのでいろいろ試行
している按配です。
jeepです。降参することにしました。

(java.lang.Nullpoさん、せっかくアドバイス頂いたのにすみません。 )
解決済み!
  • 題名: Re[6]: VB
  • 著者: java.lang.Nullpo
  • 日時: 2004/12/07 16:20:33
  • ID: 7917
  • この記事の返信元:
    • [7911] Re[5]: VB jeep 2004/12/07 15:27:18 [解決]
  • この記事への返信:
  • ツリーを表示
■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;
}
解決済み!
jeepです。

> 私の責任でもありますので、汎用的な関数を作ってみました。

責任と言われると。。。単に私の能力の問題ですので。。。

DOBON.NET | プログラミング道 | プログラミング掲示板