C#中的十进制舍入问题

时间:2011-09-12 12:26:43

标签: c# decimal rounding

全部,

我在C#中设置了decimal个值。我将这些写入类中的字段,然后将此类序列化为XML数据文件。但是,在尝试将存储为零或0的值四舍五入到四个小数位时,我遇到了问题。我希望0存储为0.0000。这可以使用decimal吗?当然,在转换为string时我可以毫无问题地执行此操作,这不是问题所在。我已阅读了许多主题,但似乎没有人解决这个问题。

任何帮助都将非常感激。我的代码snippit是:

// directCost (dCost).
decimal dCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.directCost]);
dCost = decimal.Round(dCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.dCost = dCost;

// indirectCost (iCost).
decimal iCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.indirectCost]);
iCost = decimal.Round(iCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.iCost = iCost;

但是这不会强制0到0.0000,这对于.xml数据文件所需的格式是个问题。

4 个答案:

答案 0 :(得分:7)

将此行添加到您的代码中

dCost *= 1.0000m;

例如:

// directCost (dCost).
decimal dCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.directCost]);
dCost *= 1.0000m;
dCost = decimal.Round(dCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.dCost = dCost;

希望这有助于:)

答案 1 :(得分:2)

您遇到的问题是将值格式化为字符串,而不是如何存储。该值以二进制形式存储,它是您将其更改为有问题的字符串的部分。您可以尝试:string.Format("{0:0.0000}", iCost);

答案 2 :(得分:0)

在格式化数字输出之前,您将看不到额外的精度。例如。没有人会说这个数字是1.0000而不是简单的1或1.0。但是当数字是1.2345时 - 你会看到这种精确度。

所以你做的很好。将它写入文件时将其格式化为4位小数,当它是整数时将得到.0000,或者在使用精度时得到.2345(或其他任何值)。

答案 3 :(得分:0)

我认为在序列化所有字段的值时会使用ToString()方法将其转换为字符串。也许你可以在一个继承自十进制或写一个扩展方法的新类型中覆盖这个方法(不知道它是否有效)。