27

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

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

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

4

7 回答 7

53

您真的不能以幼稚的方式比较浮点和整数值;特别是,因为有经典的浮点 表示挑战。您可以做的是从另一个中减去一个,看看它们之间的差异是否小于您关心的某个精度,如下所示:

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

于 2009-10-30T14:27:41.483 回答
4

在任何语言中比较整数和浮点数的相等性是一个非常糟糕的主意。它适用于非常简单的情况,但是在您进行任何数学运算之后,程序执行您希望它执行的操作的可能性会急剧下降。

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

如果您非常确定要使用它,请创建一个类来让您拥有自己的分数。使用一个 int 来维护整数,使用另一个 int 来维护分数。

于 2009-10-30T14:28:12.247 回答
1

这实际上取决于您认为“平等”的内容。如果您希望您的比较在且仅当 double 与整数值精确匹配(即没有小数部分)时才返回 true,您应该将 int 转换为 double 以进行比较:

bool isEqual = (double)iValue == dValue;

如果将 1.1 之类的值视为等于 1,则可以将 double 转换为 int(如果您想完全忽略小数部分),或者如果您想让 1.9 等于 2,则将 double 舍入。

于 2009-10-30T14:27:52.213 回答
0

如今,几乎唯一一次应该比较类型的值,或者double为了严格相等是当由于某种原因,一个人被卡住存储或传递整数作为浮点值,然后需要将它们转换回来。在大多数情况下,通过将整数类型转换为,然后比较该转换的结果,可以最容易地完成这种转换。请注意,如果数字超出范围 ±2 52 ,则从to的转换可能不精确。尽管如此,在 64 位可用之前的日子里,它是一种方便的存储类型,用于存储对于 32 位来说太大但又小到足以由.integerlongdoublelongdoublelongdoubleintdouble

请注意,如果 的标称值与该值不完全匹配,但表示最接近该值,则将 a 转换longdouble然后进行比较将产生“相等”的结果。如果人们认识到浮点类型实际上并不表示单个精确值,而是表示一个值范围,则此行为是有意义的。doublelongdouble

于 2012-03-26T23:49:03.963 回答
0
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 的最低可能值。

于 2012-06-25T12:31:13.630 回答
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。

于 2020-01-15T13:00:19.643 回答
0

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

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue == dValue;

这返回真。

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

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

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

于 2021-04-21T04:21:48.533 回答