在C#中,如何使尾随的零不被丢弃在十进制数中?

在C#中,如何使尾随的零不被丢弃在十进制数中?,c#,zero,trailing,C#,Zero,Trailing,我正在创建一个RandomDecimal函数,该函数允许您指定小数的最大值和精度。但是,如果选择的最后一个随机数字恰好为零,则会删除该数字,并且精度会降低。有可能不失去这个零吗?我试着把它转换成一个字符串,然后再转换成一个小数,但还是被删除了 public static decimal RandomDecimal(int maxValue, int precision) { decimal result = new Random().Next(maxValue);

我正在创建一个
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;
    }
publicstaticdecimalrandomindecimal(int-maxValue,int-precision)
{
十进制结果=new Random().Next(maxValue);
如果(maxValue==0)
{
返回结果;
}
int i=1;
小数位数=0;

while(i如果您想要一个数字的表示形式,它不仅有一个值,而且还知道它有多少个有效数字,那么最好使用除
double
/
float
/
decimal
之外的其他形式。您需要创建自己的类型,该类型既有值,又有
有效数字
属性


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

您想要做的事情只能通过返回
字符串而不是
十进制来完成(使用内置类型)。您还应该声明一次
随机
对象,而不是在一个方法中多次创建新对象

    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());
    }
static Random r=new Random();
公共静态字符串RandomDecimal(int-maxValue,int-precision)
{
十进制结果=r.Next(最大值);
如果(最大值!=0)
{
int i=1;
小数位数=0;

而(iDecimal结构在内部将比例因子存储为10的幂

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


我不知道有什么方法可以直接设置比例因子,除非使用
十进制(Int32,Int32,Int32,Boolean,Byte)
constructor,它将缩放因子作为最后一个参数。因此,理论上,您可以通过使用该构造函数创建小数来创建一个尾随0的小数。

这种“精度”仅在转换为字符串时存在。@HenkHolterman不正确。对于现有的C#数据类型,这是正确的,但在概念上是n不是字符串的数字可以有“精度”。我刚才特别说的是十进制数。它不记录小数位数。@HenkHolterman:也许他指的是“刻度”对于96位整数?根据Decimal的MSDN描述,不是真的。@MNGwinn从我所能看到的一切来看,这是一个实现细节,因为数据不可用或不可由公共接口更改(除了直接获取/设置结构的位)。因此,即使可以使用十进制,也会非常困难,因此最好还是创建一个新类型。这样可以轻松获取或设置特定值的精度,对值进行加法/乘法或其他操作,并使用自己的规则确定结果的精度(除了
decimal
所做的以外)等。一种新的类型很可能是更好的解决方案。我的反对意见只是说他想要的数据不是以十进制存储的。我想我的情况只是得到了不同的解释,我看到了你们两人所说的不同。两人都很有帮助。谢谢你!@MNGwinn因为你是对的,所以改变了措辞从技术上讲,可以使用十进制,但这很困难,而且没有效率。感谢您提供的关于反复生成随机对象的提示。:)我脑海中的某些东西告诉我,这可能不是最佳实践。只是运行了我的代码,这实际上是正确的…十进制没有数字,但一旦我将其转换为字符串,数字就会重新出现。谢谢你的帮助!我仍然希望有一种方法可以让它们在不转换为字符串的情况下显示,但这应该是正确的就我的目的而言,这已经足够了。在某种程度上,你可以。没有什么可以阻止你对多个答案进行投票,然后选择最好的答案。