C# 转换十进制,但保留与原始C相同的位数#

C# 转换十进制,但保留与原始C相同的位数#,c#,decimalformat,C#,Decimalformat,例如,如果我有一个10.205的小数,我减去了0.305,那么它应该显示为09.900而不是9.9,因为所有不必要的前后数字都应该变成零 因此,如果有一个方法可以计算10205-305(=9900),然后返回一个转换后的十进制字符串“09.900”,那就更好了 我如何始终保持相同数量的数字。我构建了这个扩展方法: public static decimal getDecimalFixed(decimal amount, decimal subtract) { var parts = am

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

因此,如果有一个方法可以计算10205-305(=9900),然后返回一个转换后的十进制字符串“09.900”,那就更好了


我如何始终保持相同数量的数字。

我构建了这个扩展方法:

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));
} 
如果我写这段代码:

decimal x = 10.205m;
decimal y = 0.305m;

decimal z = x - y;

Console.WriteLine(z);
输出为
9.900
。不需要做任何特别的事情

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

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

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

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

然后你可以做
z=newdecimal(newint[]{99*10*10,0,0,65536+2*65536})


然后当我做
Console.WriteLine(z)
的时候,我得到了
9.900

@maccettura关于规则的信息,我希望有一个像你这样有声望的人对这些规则非常熟悉。然而,这种越轨行为清楚地表明你不是。还请参考帮助中心标题为“我什么时候应该发表意见?”和“我什么时候不应该发表意见”的章节,注意,在结尾处,它指出您不应该对社区行为或网站政策的讨论发表意见;请改用meta。“如果您愿意在一周左右的时间内标记这两条评论,如果它们仍然存在。我会尽量记住及时删除它们,这样它们就不会永远污染您的答案评论空间,但我不是完美的。标记应该会导致快速删除。和平!)