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

Convert Decimal but stay with same amount of Digits as original C#

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

因此,如果有一种方法可以计算 10205 - 305 (= 9900),然后 return 转换后的十进制字符串“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。不需要做任何特别的事情。

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

但是,如果我将 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, 0, 196608 }.

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

然后当我 Console.WriteLine(z) 我得到 9.900.