Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不检查浮点相等/不相等_C# - Fatal编程技术网

C# 不检查浮点相等/不相等

C# 不检查浮点相等/不相等,c#,C#,我们正在使用一个代码分析器,它有这样一个规则“不要检查浮点等式/不等式” float f = 0.100000001f; // 0.1 double d = 0.10000000000000001; // 0.1 float myNumber = 3.146f; if ( myNumber == 3.146f ) //Noncompliant. Because of floating point imprecision, this will be false {

我们正在使用一个代码分析器,它有这样一个规则“不要检查浮点等式/不等式”

float f = 0.100000001f; // 0.1
double d = 0.10000000000000001; // 0.1



  float myNumber = 3.146f;
    if ( myNumber == 3.146f ) //Noncompliant. Because of floating point imprecision, this will be false
    {
      ////
     }
    else
      {
        ////
      }

    if (myNumber <= 3.146f && mNumber >= 3.146f) // Noncompliant indirect equality test
    {
      // ...
    }

    if (myNumber < 4 || myNumber > 4) // Noncompliant indirect inequality test
    {
      // ...
    }
float f=0.100000001f;//0.1
双d=0.100000000000001;//0.1
浮动myNumber=3.146f;
if(myNumber==3.146f)//不符合。由于浮点不精确,这将是错误的
{
////
}
其他的
{
////
}
if(myNumber=3.146f)//不符合间接相等测试
{
// ...
}
if(myNumber<4 | | myNumber>4)//不符合间接不等式检验
{
// ...
}
当我测试这段代码时,如果(myNumber==3.146f)为真,那么我无法理解这条规则想要说什么

此规则需要什么解决方案或代码更改


这条规则适用于C#吗?当我在谷歌上搜索时,我看到了更多的C/C++示例,因为这条规则

浮点不精确。在某些情况下,结果是意外的,因此在没有公差的情况下比较浮点数是否相等是一种不好的做法

这可以用简单的例子来说明

if(0.1 + 0.2 == 0.3)
{
    Console.WriteLine("Equal");
}
else
{
    Console.WriteLine("Not Equal");
}
它将打印不相等的

演示:


解决方案是增加一些公差,例如:

if(Math.Abs((0.1 + 0.2) - 0.3) < 0.0001)
{
    Console.WriteLine("Equal");
}
else
{
    Console.WriteLine("Not Equal");
}
if(数学绝对值((0.1+0.2)-0.3)<0.0001)
{
控制台。写入线(“相等”);
}
其他的
{
控制台。写入线(“不相等”);
}

现在它将打印
Equal

浮点不精确。在某些情况下,结果是意外的,因此在没有公差的情况下比较浮点数是否相等是一种不好的做法

这可以用简单的例子来说明

if(0.1 + 0.2 == 0.3)
{
    Console.WriteLine("Equal");
}
else
{
    Console.WriteLine("Not Equal");
}
它将打印不相等的

演示:


解决方案是增加一些公差,例如:

if(Math.Abs((0.1 + 0.2) - 0.3) < 0.0001)
{
    Console.WriteLine("Equal");
}
else
{
    Console.WriteLine("Not Equal");
}
if(数学绝对值((0.1+0.2)-0.3)<0.0001)
{
控制台。写入线(“相等”);
}
其他的
{
控制台。写入线(“不相等”);
}

现在它将打印
Equal

一个相当可读的解决方案是为
double
定义一个扩展方法,如下所示:

public static class FloatAndDoubleExt
{
    public static bool IsApproximately(this double self, double other, double within)
    {
        return Math.Abs(self - other) <= within;
    }

    public static bool IsApproximately(this float self, float other, float within)
    {
        return Math.Abs(self - other) <= within;
    }
}

有关更多信息,请参见。

一个可读性较好的解决方案是为
double
定义扩展方法,如下所示:

public static class FloatAndDoubleExt
{
    public static bool IsApproximately(this double self, double other, double within)
    {
        return Math.Abs(self - other) <= within;
    }

    public static bool IsApproximately(this float self, float other, float within)
    {
        return Math.Abs(self - other) <= within;
    }
}


有关更多信息,请参见。

这至少是一条解释得很糟糕的规则。如果在一个方法中有两个相同的浮点文本,包括后缀,我确实希望它们相等。比较精度是我们应该注意的,否则在大多数情况下,事情可能会超出预期,您可能需要类似于
If(Math.Abs(x-3.1416f)<0.0001)的内容
以防止舍入错误引起的错误。@jetstream96我有一个double和一个Int,所以我可以像这样编写double测试;Int I;如果(Math.Abs(test-I)<0.0001),这至少是一条解释得很糟糕的规则。如果在一个方法中有两个相同的浮点文本,包括后缀,我确实希望它们相等。比较精度是我们应该注意的,否则在大多数情况下,事情可能会超出预期,您可能需要类似于
If(Math.Abs(x-3.1416f)<0.0001)的内容
以防止舍入错误引起的错误。@jetstream96我有一个double和一个Int,所以我可以像这样编写double测试;Int I;如果(Math.Abs(test-I)<0.0001),你建议这个问题的解决方案是什么?@reddy给出了例子。我有一个double和一个Int,所以我可以像这个double-test那样写;Int I;如果(
double
int
之间的(Math.Abs(test-I)<0.0001)@reddy算术运算是在double中完成的,
int
将首先隐式转换为double。@niyokoyulawan double test=0.5+0.5;int i=1;if(test==i){Console.WriteLine(“相等”);}else{Console.WriteLine(“不相等”);}它给了我同样的结果你对这个问题推荐的解决方案是什么?@reddy给出了一些例子。我有一个double和一个Int,所以我可以像这个double测试那样写作;Int I;如果(
double
int
之间的(Math.Abs(test-I)<0.0001)@reddy算术运算是在double中完成的,
int
将首先隐式转换为double。@niyokoyulawan double test=0.5+0.5;int i=1;如果(test==i){Console.WriteLine(“Equal”);}或者{Console.WriteLine(“notequal”);}它会给我相同的结果@Mathew Watson在不同的情况下公差(0.001)会不同吗?@reddy Yes,您可以为正在进行的计算选择合适的公差级别。通常,您会选择0.0000001之类的值,但如果(例如)您使用的数据仅精确到小数点后两位,您可能只会使用0.005@Mathew Watson公差(0.001)在不同情况下会有所不同吗?@reddy是的,您会选择适合您正在进行的计算的公差级别。通常您会选择0.0000001之类的值,但如果(例如)您使用的数据仅精确到小数点后两位,则可能只使用0.005