相关疑难解决方法(0)

将System.Double与'0'(数字,int?)进行比较的正确方法

对不起,这可能是一个简单的愚蠢问题,但我需要知道确定.

我有这个if表达,

void Foo()
{
    System.Double something = GetSomething();
    if (something == 0) //Comparison of floating point numbers with equality 
                     // operator. Possible loss of precision while rounding value
        {}
}
Run Code Online (Sandbox Code Playgroud)

这个表达是否与...相等

void Foo()
{
    System.Double something = GetSomething();
    if (something < 1)
        {}
}
Run Code Online (Sandbox Code Playgroud)

?因为那时我可能会遇到问题,输入if例如0.9的值.

c# compare

82
推荐指数
5
解决办法
8万
查看次数

Double.Epsilon表示相等,大于,小于,小于或等于,大于或等于

http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

如果创建一个自定义算法来确定是否可以将两个浮点数视为相等,则必须使用大于Epsilon常量的值来确定两个值相等的可接受的绝对差值.(通常,差异幅度比Epsilon大很多倍.)

那么这不是真正可以用于比较的ε吗?我真的不明白MSDN的措辞.

它可以在这里的示例中用作epsilon吗?- 浮动和双重比较最有效的方法是什么?

最后这看起来非常重要,所以我想确保我有一个可靠的实现平等,大于,小于,小于或等于,大于或等于.

c# epsilon

52
推荐指数
5
解决办法
5万
查看次数

为什么这个循环永远不会结束?

可能重复:
比较C#中的double值时出现问题

我在其他地方读过它,但是真的忘记了答案,所以我再次问这里.无论你用任何语言编写它,我都不会结束这个循环(我用C#,C++,Java测试它):

double d = 2.0;
while(d != 0.0){
   d = d - 0.2;
}
Run Code Online (Sandbox Code Playgroud)

floating-point ieee-754

19
推荐指数
3
解决办法
1054
查看次数

为什么C#中的浮点运算不精确?

为什么以下程序会打印出打印的内容?

class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f*100f;
        float f2 = 0.09f*99.999999f;

        Console.WriteLine(f1 > f2);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

false
Run Code Online (Sandbox Code Playgroud)

c# floating-point

13
推荐指数
3
解决办法
2万
查看次数

将double比较为0是不对的:doubleVariable == 0?

可以这样做吗?

double doubleVariable=0.0;
if (doubleVariable==0) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

或者这段代码会遇到潜在的舍入问题?

c# double

12
推荐指数
1
解决办法
2万
查看次数

获取在列表中两次出现exaclty的对象列表

我有一个List<CustomPoint> points;包含近百万个对象的东西.从这个列表中我想得到恰好发生两次的对象列表.最快的方法是什么?我也会对非Linq选项感兴趣,因为我可能也必须在C++中这样做.

public class CustomPoint
{
    public double X { get; set; }
    public double Y { get; set; }

    public CustomPoint(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }
}

public class PointComparer : IEqualityComparer<CustomPoint>
{
    public bool Equals(CustomPoint x, CustomPoint y)
    {
        return ((x.X == y.X) && (y.Y == x.Y));
    }

    public int GetHashCode(CustomPoint obj)
    {
        int hash = 0;
        hash ^= obj.X.GetHashCode();
        hash ^= obj.Y.GetHashCode();
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

基于这个答案,我试过, …

c# duplicates

11
推荐指数
2
解决办法
704
查看次数

C# Equals() == 关于数字

我尝试以下代码使用==Equals数字比较:

Console.WriteLine( (int)2 == (double)2.0 );     
Console.WriteLine( ( (int)2 ).Equals( (double)2.0) );

Console.WriteLine((float)2.0 == (double)2.0);
Console.WriteLine( ( (float)2.0 ).Equals( (double)2.0 )   );
Run Code Online (Sandbox Code Playgroud)

结果:

true 
false
true 
false
Run Code Online (Sandbox Code Playgroud)

int, double, float都是ValueType,在阅读了帖子Here1Here2后,我仍然无法理解为什么==结果Equals不同,

这4个案例==背后的工作细节是什么?Equals

(如果这个问题重复,请告诉我)



编辑: 4个更有趣的案例:

双精度型、浮点型 <-> 整数型

Console.WriteLine((double)2.0 == (int)2);              //True
Console.WriteLine(((double)2.0).Equals((int)2));       //True

Console.WriteLine((float)2.0 == (int)2.0);             //True
Console.WriteLine(((float)2.0).Equals((int)2.0));      //True
Run Code Online (Sandbox Code Playgroud)

双精度型、整型 <-> 浮点型

Console.WriteLine((double)2.0 == (float)2.0);          //True
Console.WriteLine(((double)2.0).Equals((float)2.0));   //True

Console.WriteLine((int)2 == (float)2.0);               //True …
Run Code Online (Sandbox Code Playgroud)

c#

6
推荐指数
2
解决办法
6192
查看次数

带+运算符的C#奇怪行为

谁能告诉我为什么下面的语句评估为false?

bool myBoolean = .6 + .3 + .1 == .1 + .3 + .6; // false
Run Code Online (Sandbox Code Playgroud)

它在Javascript和C++中做同样的事情.

javascript c# c++

5
推荐指数
1
解决办法
140
查看次数

C#与.Equals()比较两个double

我使用ReShaper,当我用==比较两个double值时,它表明我应该使用Math.具有公差的ABS方法.请参阅:https://www.jetbrains.com/help/resharper/2016.2/CompareOfFloatsByEqualityOperator.html

这个例子

double d = 0.0;
double d2 = 0.0;
if (d == d2)
{
    /* some code */
}
Run Code Online (Sandbox Code Playgroud)

然后转换为

double d = 0.0;
double d2 = 0.0;
if (Math.Abs(d - d2) < TOLERANCE)
{
    /* some code */
}
Run Code Online (Sandbox Code Playgroud)

但我认为开发人员考虑正确的容忍度确实很复杂.所以我认为这可以在Double.Equals()方法中实现.

但是这种方法是这样实现的

public override bool Equals(Object obj) {
    if (!(obj is Double)) { 
        return false;
    } 
    double temp = ((Double)obj).m_value; 
    // This code below is written this way for performance reasons i.e the != and == …
Run Code Online (Sandbox Code Playgroud)

c# double compare

5
推荐指数
1
解决办法
4436
查看次数

当列表很大时,C#List.Find()似乎不起作用

我有一个巨大的列表,其中有1000万个项目,我试图在列表中找到一个特定的值.

这是我的项目

struct reference
{
    public double GPST;
    public byte cls;
    public ushort fn;
    public int ret_num;
}
Run Code Online (Sandbox Code Playgroud)

这是我的查询代码

 List<reference> ref_pts;

 List<reference> result = ref_pts.FindAll(delegate(reference obj) { return obj.GPST == pt.GPST; });
Run Code Online (Sandbox Code Playgroud)

其中pt.GPST是我想在List中找到的值

是因为尺寸太大,Find方法不起作用(总是什么都不返回)?

.net c# comparison

3
推荐指数
1
解决办法
244
查看次数