【发布时间】:2017-11-27 21:18:14
【问题描述】:
例如,如果我有一个小数点 10.205,我减去了 0.305,那么它应该显示为 09.900 而不是 9.9,因为之前和之后所有不必要的数字都应该变成零。
所以也许最好有一个方法来计算 10205 - 305 (= 9900),然后返回转换后的十进制字符串“09.900”。
我怎样才能始终保持相同的位数。
【问题讨论】:
标签: c# decimalformat
例如,如果我有一个小数点 10.205,我减去了 0.305,那么它应该显示为 09.900 而不是 9.9,因为之前和之后所有不必要的数字都应该变成零。
所以也许最好有一个方法来计算 10205 - 305 (= 9900),然后返回转换后的十进制字符串“09.900”。
我怎样才能始终保持相同的位数。
【问题讨论】:
标签: c# decimalformat
如果我写这段代码:
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。
【讨论】:
我构建了这个扩展方法:
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));
}
【讨论】: