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

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

int iValue = 0; double dValue = 0.0; bool isEqual = iValue.Equals(dValue); 

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

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

 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

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

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

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

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

 bool isEqual = (double)iValue == dValue; 

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

 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的最低值。

现在,几乎唯一一次应该比较double类型的值和integerlong的严格相等的值是由于某种原因,一个被卡住存储或传递整数量作为浮点值然后需要将它们转换回来。 在大多数情况下,这种转换最容易通过将积分类型转换为double ,然后比较该转换的结果。 请注意,如果数字超出±2 52的范围,则从longdouble转换可能是不精确的。 尽管如此,在64位long可用之前的日子里, double是一个方便的存储类型,对于32位整数而言太大而不能用于处理整数。

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