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/以外的东西decimal。您需要创建自己的类型,该类型既具有值又具有SignificantDigits属性。

您只是希望信息decimal不是为了让用户使用而设计的。在某些情况下(您没有前导/尾随零),尽管 [ decimal] 不知道信息,但您巧合地最终得到相同的结果,但这与您解决问题无关。

于 2012-07-19T17:40:01.007 回答
1

string你想要的只能通过返回 a而不是 a来完成(使用内置类型)decimal。您还应该声明一个Random对象一次,而不是在一个方法中多次创建新对象。

    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

缩放因子还保留 Decimal 数字中的任何尾随零。尾随零不会影响算术或比较运算中的 Decimal 数的值。但是,如果应用了适当的格式字符串,则 ToString 方法可以显示尾随零。

对我来说,没有任何方法可以直接设置比例因子,除非使用Decimal (Int32, Int32, Int32, Boolean, Byte)构造函数,它将比例因子作为最后一个参数。因此,理论上,您可以通过使用该构造函数创建 Decimals 来创建带有显着尾随 0 的小数。

于 2012-07-19T17:47:09.400 回答