C#XML序列化和十进制值

C#XML序列化和十进制值,c#,xml,xml-serialization,decimal,C#,Xml,Xml Serialization,Decimal,我正在使用XmlSerializer将包含十进制数的C#对象序列化为xml字符串 e、 g 我发现精度特别不同,即使我显式四舍五入如下,一些值在该点后以四个值输出,例如12564.39以12564.3900输出 AnObject.ADecimalValue=decimal.Round(AnObject.ADecimalValue,2) 下面是序列化代码 XmlSerializer serializer = new XmlSerializer(typeof(AnObject));

我正在使用XmlSerializer将包含十进制数的C#对象序列化为xml字符串

e、 g

我发现精度特别不同,即使我显式四舍五入如下,一些值在该点后以四个值输出,例如12564.39以12564.3900输出

AnObject.ADecimalValue=decimal.Round(AnObject.ADecimalValue,2)

下面是序列化代码

   XmlSerializer serializer = new XmlSerializer(typeof(AnObject));

    using (StringWriter writer = new StringWriter())
    {
        serializer.Serialize(writer, source);

        string result = writer.ToString();

        return result;
    }

如何确保小数点后只输出两个值

我认为对浮点数进行四舍五入没有帮助。序列化程序根据自己的规则将数字转换为字符串。最好是引入一个新的字符串属性,并格式化其中的数字,然后将其序列化,而不是原始数字

有关该主题的更多信息,类似问题:

能否实现
IXmlSerializable
来重新定义序列化对象的方式

文档和如何实现它的良好分解


然后有一个帖子是由一个和你有类似(但不相关)问题的人写的。您可以正确地对小数进行四舍五入,看看是否有效,如果无效,则可以将其作为字符串写出。

以下是我解决类似问题的方法,它对我来说非常有效

    private decimal  price;

    [XmlElement(DataType="decimal")]
    public string  Price
    {
        get { return price.ToString("c"); }
        set { price = Convert.ToDecimal(value); }
    }
在我的例子中,我将其转换为货币,但您可以使用price.ToString(“0.00”)将XML元素转换为带2个零的十进制

添加
DataType=“decimal”
参数给了我一个运行时InvalidOperationException,消息是“decimal是属性XmlElementAttribute.DataType.decimal的无效值,无法转换为System.String。”(请注意,消息是本地化的,我将其翻译回了英语,因此可能会有一些不同)。
    private decimal  price;

    [XmlElement(DataType="decimal")]
    public string  Price
    {
        get { return price.ToString("c"); }
        set { price = Convert.ToDecimal(value); }
    }