比较Double和Int的最佳方法是什么?

时间:2009-10-30 14:24:17

标签: c# double int equals

C#中的以下代码不起作用:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

所以,问题是:比较Double和Int的最佳方法是什么?

7 个答案:

答案 0 :(得分:48)

你真的无法以天真的方式比较浮点值和积分值;特别是,因为有经典的floating point representation challenges。你可以做的是从另一个中减去一个,看看它们之间的差异是否小于你关心的精度,如下所示:

int iValue = 0;
double dValue = 0.0;

var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
   return true; // items equal

你真的必须自己定义equality对你意味着什么。例如,您可能希望浮点值向最接近的整数舍入,以便3.999999981将“等于”4.或者您可能希望截断该值,因此它实际上将为3.这完全取决于您的内容正在努力实现。

编辑:请注意,我选择0.0000001作为示例阈值...您需要自己决定什么精度足以进行比较。只是意识到你需要在double的正常表示范围内,我相信这被定义为Double.Epsilon

答案 1 :(得分:4)

将整数和浮点数用于任何语言的相等性比较是一个非常糟糕的主意。它适用于非常简单的情况,但在你完成任何数学运算之后,程序执行你想要的程序的可能性会大大降低。

它与浮点数存储在二进制数字系统中的方式有​​关。

如果您非常确定要使用此功能,请创建一个类以使用分数创建自己的数字。使用一个int来维护整数,另一个int来维持分数。

答案 2 :(得分:1)

这实际上取决于你认为“平等”的东西。如果您希望比较返回true,当且仅当double精确匹配整数值(即没有小数组件)时,您应该将int转换为double来进行比较:

bool isEqual = (double)iValue == dValue;

如果像1.1这样的东西被认为等于1,你可以将double转换为int(如果你想完全忽略小数分量),或者如果你想要说1.9等于2,则将double加倍。

答案 3 :(得分:1)

double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
    // Put your code here
}

      OR

if((val2 - Double.Epsilon) < 0)
{
    // Put your code here
}

其中Double.Epsilon是Double的最低可能值。

答案 4 :(得分:0)

如今,为了严格要求,只有一次应该比较类型doubleintegerlong的值,这是因为某种原因导致存储或将整数量作为浮点值传递,稍后需要将它们转换回来。在大多数情况下,这种转换最容易通过将整数类型转换为double,然后比较该转换的结果来实现。请注意,如果数字超出范围±2 52 ,则从longdouble的转换可能不准确。尽管如此,在64位long可用之前的日子里,double对于整数量来说是一个方便的存储类型,对于32位int来说太大了但是小到可以处理double

请注意,如果long的名义值与{{1}不完全匹配,则将double转换为double然后进行比较将产生“相等”的结果}},但表示与该值最接近的long。如果人们认识到浮点类型实际上并不代表单个精确值,而是一系列值,则此行为是有意义的。

答案 5 :(得分:0)

来自https://docs.microsoft.com/en-us/dotnet/api/system.double.equals?view=netframework-4.8#System_Double_Equals_System_Double_

因为Epsilon定义了正值的最小值 范围接近零,两个相似 值必须大于Epsilon。通常,很多次 大于Epsilon。因此,我们建议您不要 比较Double值是否相等时使用Epsilon。

答案 6 :(得分:0)

如果您尚未使用双精度数进行任何计算,则可以使用 ==。这是因为整数可以精确地用双精度表示(仅在 -2^53 和 2^53 之间)。

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue == dValue;

返回 true。

Equals 不起作用的原因是 == 运算符会在比较前自动将整数转换为双精度数,而 Equals 不会,因此失败。

>

这个答案有更多信息: https://stackoverflow.com/a/52525223/15714398

如果您使用双倍数进行计算,则所有赌注都将取消,您必须对计算中的有效数字进行一些分析。