【问题标题】:Convert Decimal but stay with same amount of Digits as original C#转换十进制,但保持与原始 C# 相同数量的数字
【发布时间】:2017-11-27 21:18:14
【问题描述】:

例如,如果我有一个小数点 10.205,我减去了 0.305,那么它应该显示为 09.900 而不是 9.9,因为之前和之后所有不必要的数字都应该变成零。

所以也许最好有一个方法来计算 10205 - 305 (= 9900),然后返回转换后的十进制字符串“09.900”。

我怎样才能始终保持相同的位数。

【问题讨论】:

    标签: c# decimalformat


    【解决方案1】:

    如果我写这段代码:

    decimal x = 10.205m;
    decimal y = 0.305m;
    
    decimal z = x - y;
    
    Console.WriteLine(z);
    

    输出为9.900。不需要做任何特别的事情。

    现在,如果我在上面的z 上执行decimal.GetBits(z),我会得到int[] { 9900, 0, 0, 196608 }

    但是,如果我将z 重新定义为z = 9.9 并执行decimal.GetBits(z) 我得到int[] { 99, 0, 0, 65536 }

    数组中的第四个值是小数位数(如果你除以 65535 就可以知道有多少)。

    所以,z = 9.9 我得到 1 个小数位 (65536 / 65536 == 1)。要将其更改为 3 位小数,我将 2 * 65536 添加到第四个整数,但我还需要将第一个整数乘以 100(或 10 ^ 2)。然后我得到这些位:int[] { 9900, 0, 0, 196608 }

    那你就可以z = new decimal(new int[] { 99 * 10 * 10, 0, 0, 65536 + 2 * 65536 });了。

    然后当我执行Console.WriteLine(z) 时,我得到9.900

    【讨论】:

      【解决方案2】:

      我构建了这个扩展方法:

      public static decimal getDecimalFixed(decimal amount, decimal subtract)
      {
          var parts = amount.ToString().Split('.');
          decimal sum = amount - subtract;
      
          // get's a string of zeros using the same amount of digits
          string part1zeros = new String('0', parts[0].Length); 
          string part2zeros = new String('0', parts[1].Length);
      
          // decimal format ex: ToString("000.0000")
          return Convert.ToDecimal(sum.ToString(part1zeros + "." + part2zeros));
      } 
      

      【讨论】:

      • @maccettura 关于规则,我希望有你声誉的人对它们非常熟悉。然而,这种越界清楚地表明你不是。另请参阅帮助中心标题为"Privileges - comment" 的部分,特别是标题为“我应该何时发表评论?”和“何时不应该我评论?,并指出它在结尾处声明您不应该评论...“讨论社区行为或网站政策;请改用元数据。”
      • 如果您愿意在一周左右的时间内标记这两个 cmets,如果他们还在的话。我会尽量记住及时删除它们,这样它们就不会永远污染你的答案评论空间,但我并不完美。标记应导致快速删除。和平! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 2013-06-17
      • 2022-01-06
      • 2018-09-07
      • 2017-04-02
      相关资源
      最近更新 更多