2

RandomDecimal最大値と小数点以下の精度を指定できる関数を作成しています。ただし、選択された最後のランダムな数字がたまたまゼロの場合、それは削除され、精度はオフになります。このゼロを失わないことは可能ですか?文字列に変換してから小数に戻してみましたが、まだ削除されています。

    public static decimal RandomDecimal(int maxValue, int precision)
    {
        decimal result = new Random().Next(maxValue);

        if (maxValue == 0)
        {
            return result;
        }

        int i = 1;

        decimal digit = 0;

        while (i <= precision)
        {
            digit = new Random().Next(10);
            digit = (digit / (Convert.ToDecimal(Math.Pow(10, i))));
            result = result + digit;
            i++;
        }

    //    if (digit == 0)
    //    {
    //     string resultstring = Convert.ToString(result) + '0';
   //      result = Convert.ToDecimal(resultstring);
   //       } This code doesn't do anything because the zero is still dropped.

        return result;
    }
4

3 に答える 3

4

double値だけでなく、有効桁数がわかっている数値の表現が必要な場合は、 / float/以外のものを使用することをお勧めしますdecimalSignificantDigits値とプロパティの両方を持つ独自の型を作成する必要があります。

decimalユーザーが使用するように設計されていない情報が必要なだけです。特定の状況 (先頭/末尾のゼロがない場合) では、 [ decimal] 情報を知らなくても偶然にも同じ結果になりますが、それは問題の解決には関係ありません。

于 2012-07-19T17:40:01.007 に答える
1

string必要なことは、 の代わりに を返すことによってのみ (組み込み型で) 実行できますdecimalRandomまた、1 つのメソッド内で新しいオブジェクトを複数回作成するのではなく、オブジェクトを 1 回宣言する必要があります。

    static Random r = new Random();
    public static string RandomDecimal(int maxValue, int precision)
    {
        decimal result = r.Next(maxValue);

        if (maxValue != 0)
        {
            int i = 1;

            decimal digit = 0;

            while (i <= precision)
            {
                digit = r.Next(10);
                digit = (digit / (Convert.ToDecimal(Math.Pow(10, i))));
                result = result + digit;
                i++;
            }
        }
        var sb = new StringBuilder("0.");
        sb.Append('0', precision);
        return result.ToString(sb.ToString());
    }
于 2012-07-19T17:46:29.163 に答える
1

Decimal 構造体は、倍率を 10 のべき乗として内部的に格納します。MSDN によると

スケーリング係数は、10 進数の末尾のゼロも保持します。末尾のゼロは、算術演算または比較演算の 10 進数の値には影響しません。ただし、適切な書式文字列が適用されている場合は、ToString メソッドによって末尾のゼロを明らかにすることができます。

Decimal (Int32, Int32, Int32, Boolean, Byte)スケーリング係数を最後の引数として取るコンストラクターを使用する以外に、スケーリング係数を直接設定する方法があることは明らかではありません。したがって、理論的には、そのコンストラクターで Decimals を作成することにより、重要な末尾の 0 を持つ 10 進数を作成できます。

于 2012-07-19T17:47:09.400 に答える