由于double类型运算时常常出现一些问题,
如3.6+1.2-1.2 就等于 3.6 
可是double类型常常出现 3.59999……4 之类的,于是我做了个d类,用来代替double,结果遇到这个问题d[] cc = new d[29];
当cc[2]==null时,引用cc[2]总是出错可是有一种情况,却完全相反
string aa=new string[29]
当aa[2]==null时,引用aa[2]总没有出错,这是为什么呢?
以下为类名
        public class d
        {
            double dd;
            public d()
            {
                dd = 0;
            }
            public d(double d)
            {
                double a = Math.Round(d, 3);
                if (a == d)
                    this.dd = a;
                else if (Math.Abs(a - d) * 1000000 < 1)
                    this.dd = a;
                else
                    this.dd = d;
            }
            public double Value
            {
                set
                {
                    dd = value;
                }
                get
                {
                    if (this == null)
                        return 0;
                    if (dd==null)
                        return 0;
                    return dd;
                }
            }
            public static implicit operator d(double d)
            {
                return new d(d);
            }
            public static implicit operator double(d d)
            {
                if (d == null)
                {
                    return 0;
                }
                return d.dd;
            }
            public static implicit operator string(d d)
            {
                return d.dd.ToString();
            }
            public static d operator +(d d1, d d2)
            {
                return new d(d1.dd + d2.dd);
            }
            public static d operator -(d d1, d d2)
            {
                return new d(d1.dd - d2.dd);
            }
            public static d operator *(d d1, d d2)
            {
                return new d(d1.dd * d2.dd);
            }
            public static d operator /(d d1, d d2)
            {
                return new d(d1.dd / d2.dd);
            }
        }

解决方案 »

  1.   

    哥们,错误太多了。1、
     if (this == null)
      return 0;
    如果在一个null的对象上调用Value属性的话,则本来就会报未将对象设置到对象的实例的错误了。
    所以你的this==null永远不会执行的2、
    if (dd==null)double 是值类型,dd永远不可能等于null 你的代码能编译通过吗????
      

  2.   

    由于double类型运算时常常出现一些问题,
    如3.6+1.2-1.2 就等于 3.6  
    可是double类型常常出现 3.59999……4 之类的,这个怎么解决啊
      

  3.   


    double d = Math.PI;
                Console.WriteLine(d.ToString("f2"));            d = 3.5874144;
                Console.WriteLine(d.ToString("f2"));
    了解下IEEE754吧。
    对于精度要求很高的应用,你可以保留很多的小数位。
    但对于一个公司的财务报表来说,如150000.14,多数情况下保留一位就可以了,您会为4分钱去开除公司的财务吗?
      

  4.   

    你可以用Decimal 代替double,Decimal 很精确,可以进行==比较,如果用double也是可以的,只是在进行相等比较的时候不要用==运算符,而是Math.Abs(3.6-a)<1e-16来代替a==3.6就可以了,