2

当我序列化我的对象时,我的双精度值被打印为 -9.9999999999988987E-05 我该如何解决这个问题,这样我才能得到一个小数点后 4 位的数字?

public class DecisionBar
    {
    public DateTime bartime 
         { get; set; }
    public string frequency
             { get; set; }
    public bool HH7
            {get;set;}
    public bool crossover
            {get;set;}
    public double mfe
            {get;set;}
        public double mae
            {get;set;}
                public double currentprofitability
            {get;set;}
    public double entryPointLong
            {get;set;}
    public double entryPointShort
            {get;set;}
    public double exitStopFull
            {get;set;}
    public double exitStopPartial 
                {get;set;}
     [XmlAttribute]         
    public string EntryOrExit
                {get;set;}
//    public DecisionBar()
//          {
//          crossover =false;
//          }

    }

输出。

<DecisionBar>
    <bartime>2012-07-24T08:59:00</bartime>
    <frequency>1 MINUTES</frequency>
    <HH7>false</HH7>
    <crossover>false</crossover>
    <mfe>0.00019999999999997797</mfe>
    <mae>-9.9999999999988987E-05</mae>
    <currentprofitability>0</currentprofitability>
    <entryPointLong>0</entryPointLong>
    <entryPointShort>0</entryPointShort>
    <exitStopFull>0</exitStopFull>
    <exitStopPartial>0</exitStopPartial>
</DecisionBar>
4

3 回答 3

3

在获取中舍入值,因此在序列化期间序列化程序读取舍入值。

double _mfe;
double _mae;
        public double mfe
        {
             get
             {
                return Math.Round((decimal)_mfe, 4, MidpointRounding.AwayFromZero)
             }
             set
             {
                 _mfe = value;
             }
        }

        public double mae
        {
             get
             {
                return Math.Round((decimal)_mae, 4, MidpointRounding.AwayFromZero)
             }
             set
             {
                 _mae= value;
             }
        }
于 2012-07-24T14:18:54.967 回答
2

您可以在使用序列化之前舍入双精度

mfe = Math.Round(mfe, 4, MidpointRounding.AwayFromZero) 

要自动执行此操作,您可以使用属性标记实际[XmlIgnore]属性并创建返回舍入值的新属性。

我建议不要使用私有字段和get; set;访问器,因为 getter 每次都会对属性进行舍入,而不仅仅是在序列化时。

于 2012-07-24T14:16:03.233 回答
0

您可以将双精度格式设置为小数点后 4

double number = 123.64612312313;
number = double.Parse(number.ToString("####0.0000"));
于 2012-07-24T14:18:13.030 回答