代码之家  ›  专栏  ›  技术社区  ›  flawr

如何检查数值是否为零

  •  0
  • flawr  · 技术社区  · 6 年前

    在这里,我有一个类的最小示例,该类应该为向量建模(用于线性代数计算)。它包括一种类型 T 将是整数或浮点类型(例如 int double )中。现在我想实现一个方法 CheckIfZeroAt 它检查某个条目是否包含零。问题是我想把字体 T型 变量,但据我所知,我无法告诉编译器 T型 是可以使用类型转换的数字类型。不幸的是,似乎也没有我可以限制的数值类型的接口 T型 到。

    有什么优雅的方法来解决这个问题吗?

    我提供了一些简单的方法来实现这个方法作为注释,但是没有一个是有效的。

    class MyVector<T> // T is an integral or floating point type
    {
        T[] vector;
    
        public MyVector(T[] array)
        {
            vector = array; //just a reference 
        }
    
        public bool CheckIfZeroAt(int i)
        {
            // return vector[0] == (T)0; //"Cast is redundant"
            // return vector[0] == 0; // Operator "==" cannot be applied to operands of type "T" and "int"
            // return vector[0] == 2 * vector[0]; // Operator "*" cannot be applied to operands of type "T" and "int"
        }
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   maccettura    6 年前

    .net中的数字类型有 default of 0 ,所以只要检查它是否等于 default(T)

    public bool CheckIfZeroAt(int i)
    {
        return vector[i].Equals(default(T));
    }
    

    小提琴 here

    正如汉斯在评论中指出的,这并不是最好的解决方案。似乎您应该一起跳过泛型,因为.NET中没有太多现成的数值类型。

        2
  •  1
  •   John Wu    6 年前

    你可以用 IConvertible . 这允许所有数值类型。它也允许datetime、string和bit,但是如果有人选择使用 MyVector<bool> ,你是谁?还是个数字,差不多。

    注意:由于浮点类型可能有错误,您可能希望允许公差。在我的例子中,公差是0.1。(如果公差为0.5,则可以转换为 int 而不是使用 Math.Abs )中。

    class MyVector<T> where T : IConvertible
    {
        T[] vector;
    
        public MyVector(T[] array)
        {
            vector = array; //just a reference 
        }
    
        public bool CheckIfZeroAt(int i, decimal tolerance = 0.1M)
        {
            return Math.Abs(Convert.ToDecimal(vector[i])) < tolerance;
        }
    
        public bool CheckIfZeroAt(int i)
        {
            return Convert.ToInt32(vector[i])) == 0;
        }
    
    }