C# 最有效/正确的做法是修剪小数点后无意义的零

C# 最有效/正确的做法是修剪小数点后无意义的零,c#,.net-4.0,decimal,C#,.net 4.0,Decimal,这是如此多次重复,但我想明确地陈述我的问题 How is a decimal which would look like 2.0100 "rightly" presented to the user as another "decimal" 2.01? 我在上面看到了很多问题,其中输入是字符串“2.0100”,需要小数点2.01,以及需要小数点2.0100表示为字符串“2.01”的问题。所有这些都可以通过基本的string.Trim、decimal.Parse等实现,以下是一些方法: dec

这是如此多次重复,但我想明确地陈述我的问题

How is a decimal which would look like 2.0100 "rightly" presented to the user as 
another "decimal" 2.01?
我在上面看到了很多问题,其中输入是字符串“2.0100”,需要小数点2.01,以及需要小数点2.0100表示为字符串“2.01”的问题。所有这些都可以通过基本的string.Trim、decimal.Parse等实现,以下是一些方法:

  • decimal.Parse(2.0100.ToString(“G29”))

  • 使用#文字

  • 许多字符串格式选项

  • 各种正则表达式选项

  • 我自己的一个我一直用到现在:

    if (2.0100 == 0)
        return 0;
    decimal p = decimal.Parse(2.0100.ToString().TrimEnd('0'));
    return p == 2.0100 ? p : 2.0100;
    
  • 但我相信在.Net(至少4个)中必须有正确的方法来处理数字操作,而不是字符串操作。我要求的不是将十进制作为字符串处理的方法,因为我觉得这不是正确的方法。我想学点新东西。而且我希望我能看到至少0.1秒的性能提升,因为我正在从数据库中提取数万个十进制值:)

    问题2:如果它不存在于.Net中,那么哪种字符串方法最有效地获取小数的可表示值


    编辑:我不想只给用户一个小数点。在这种情况下,我可以将其用作字符串。我确实希望它是十进制的。稍后我将不得不处理这些十进制值。所以通过ToString方法,我首先需要将其转换为string,然后再次将其解析为decimal。我正在寻找不涉及
    String
    类的东西。将decimal.20100转换为decimal.201的一些选项?

    为用户设置给定格式的十进制格式的最简单方法是使用的格式选项


    对于表示值,2.01等于2.0100。只要在
    十进制
    的精度范围内,值在系统中的存储方式就不重要了。您只需担心为用户正确设置值的格式。

    为用户设置给定格式小数点格式的最简单方法是使用的格式选项


    对于表示值,2.01等于2.0100。只要在
    十进制
    的精度范围内,值在系统中的存储方式就不重要了。您应该只担心为用户正确设置值的格式。

    数字是数字,字符串是字符串。在英语中,用字符串表示的“二度性”的概念是
    2
    。用数字表示的“两性”的概念实际上不可能表现出来,因为当你观察一个数字时,你会把它看作一个字符串。但为了论证,它可能是
    2
    2.0
    02
    02.0
    甚至
    10/5
    。这些都是“两性”的表现


    您的数据库实际上并没有返回
    2.0100
    ,您检查该值时使用的是将其转换为字符串并以这种方式表示。一个数字的末尾是否有零,始终只是字符串格式的首选项


    另外,永远不要对十进制调用
    Decimal.parse()
    ,这没有意义。如果要将十进制文字转换为字符串,只需调用
    (2.0100).ToString().TrimEnd('0')
    数字是数字,字符串是字符串。在英语中,用字符串表示的“二度性”的概念是
    2
    。用数字表示的“两性”的概念实际上不可能表现出来,因为当你观察一个数字时,你会把它看作一个字符串。但为了论证,它可能是
    2
    2.0
    02
    02.0
    甚至
    10/5
    。这些都是“两性”的表现


    您的数据库实际上并没有返回
    2.0100
    ,您检查该值时使用的是将其转换为字符串并以这种方式表示。一个数字的末尾是否有零,始终只是字符串格式的首选项

    另外,永远不要对十进制调用
    Decimal.parse()
    ,这没有意义。如果要将十进制文字转换为字符串,只需调用
    (2.0100).ToString().TrimEnd('0')
    十进制值中出现的“额外零”存在,因为
    System.decimal
    类型显式存储这些零。对于
    系统.Decimal
    1.23400
    是与
    1.234
    不同的值,即使它们在数字上相等:

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

    拥有零是很重要的,因为许多十进制计算都涉及到零,这是许多科学和高精度计算的必要条件

    在您的情况下,您不关心它们,但适当的答案不是“为我的特定应用程序更改十进制,以便它不存储这些零”。相反,它是“以对我的用户有意义的方式呈现此值”。这就是的作用。

    十进制值中出现的“额外零”存在,因为
    System.decimal
    类型显式存储这些零。对于
    系统.Decimal
    1.23400
    是与
    1.234
    不同的值,即使它们在数字上相等:

    比例因子还保留十进制数中的任何尾随零。尾随零不会影响算术或比较运算中十进制数的值。但是,ToString met可以显示尾随的零
    2.01
    
    return d / 1.00000000000000000000000000000m
    
        internal static double Calculate(Action act)
        {
            Stopwatch sw = new Stopwatch();
    
            sw.Start();
            act();
            sw.Stop();
    
            return sw.Elapsed.TotalSeconds;
        }
    
    return decimal.Parse(string.Format("{0:0.#############################}", d));
    //0.02ms
    
    return decimal.Parse(d.ToString("0.#############################"));
    //0.014ms
    
    if (d == 0)
        return 0;
    
    decimal p = decimal.Parse(d.ToString().TrimEnd('0').TrimEnd('.'));
    return p == d ? p : d;
    //0.016ms
    
    return decimal.Parse(d.ToString("G29"));
    //0.012ms
    
    return d / 1.00000000000000000000000000000m;
    //0.007ms