什么是比较长和Int的最佳方式?(What's the best way to compar

2019-09-02 15:51发布

在C#下面的代码无法正常工作:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

所以,问题:什么是比较双人和Int的最佳方式?

Answer 1:

你真的不能比较浮点和整数值在一个天真的方式; 特别是,因为有经典的浮点 表示挑战 。 你可以做的是减去从另一个,看看它们之间的差值小于你所关心的,像这样一些精度:

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



Answer 2:

这是一个非常糟糕的主意比较整数和浮点数在任何语言的平等。 它的工作原理非常简单的情况下,但你都做任何数学后,该程序的likliehood做你想要什么,以显着降低。

它与浮点数存储二进制数字系统的方式做。

如果你非常确定要使用它,创建一个类,让你用自己的分数数量。 使用一个INT保持整数,另有诠释维持分数。



Answer 3:

这真的取决于你认为“平等”是什么。 如果你希望你的比较,当且仅当双恰恰是整数值相匹配返回真(即没有小数部分),你应该投你的int双做比较:

bool isEqual = (double)iValue == dValue;

如果像1.1将被视为等于1,您可以施放双为int(如果你想完全忽略小数部分)或圆,如果你想要说的1.9等于2的两倍。



Answer 4:

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是双可能的最低值。



Answer 5:

如今,只是唯一的一次应该是比较类型的值double ,要么integerlong严格相等时,由于某种原因,一个是卡存储或通过积分量为浮点值和以后需要将其转换回。 这样的转换可在大多数情况下最容易地通过铸造整体式来完成的double ,然后比较该铸造的结果。 注意从转换longdouble可以是不精确的,如果数是范围±2 52的外侧。 尽管如此,前64位的天long面世, double是为整数量这是太大的一个32位的一个方便的存储类型int但小到足以通过处理double

需要注意的是转换longdouble ,然后做的比较将产生一个“平等”的结果,如果标称值double不精确匹配的long价值,但表示可能最接近的double该值。 这种行为很有道理,如果人们意识到浮点类型实际上并不代表一个单一的精确值,而是一个范围值。



文章来源: What's the best way to compare Double and Int?