c#中的小数舍入问题

本文关键字:舍入 问题 小数 | 更新日期: 2023-09-27 18:08:33

所有,

我在c#中有一组decimal值。我将这些写入类中的字段,然后将该类序列化为XML数据文件。但是,在尝试将存储为0或0的值四舍五入到小数点后四位时,我遇到了一个问题。我想把0存储为0.0000。使用decimal可以实现吗?当然,当铸造到string时,我可以毫无问题地做到这一点,这不是问题。我读了很多线程,但似乎没有解决这个问题。

任何帮助将是最感激的。我的代码片段是:

// 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数据文件所需的格式是一个问题。

c#中的小数舍入问题

将这行添加到您的代码

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;

希望这对你有帮助

您遇到的问题是将值格式化为字符串,而不是如何存储它。这个值是以二进制形式存储的,当你把它改成字符串的时候才会有问题。您可以尝试:string.Format("{0:0.0000}", iCost);

在格式化数字的输出之前,您不会看到额外的精度。例如,没有什么会显示数字是1.0000,而不是简单的1或1.0。然而,当数字是1.2345时,你会看到这个精度水平。

所以你所做的是好的。将其写入文件时将其格式化为小数点后4位,当它是整数时将得到0.00000,当使用精度时将得到0.2345(或其他任何数字)。

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