在C#下面的代码不工作:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

所以,问题:什么是比较双人和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内。

其他提示

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

它与浮点数存储在一个二进制数字系统上的方法来做到。

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

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

bool isEqual = (double)iValue == dValue;

如果像1.1将被认为等于1时,你可以投双为int(如果要完全忽略小数部分)或圆形,如果你想说1.9至等于2的双

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的值和任一integerlong严格平等时,由于某种原因,一个被卡住存储或传递积分量为浮点值和后来需要它们转换回来。这样的转换可在大多数情况下最容易地通过铸造整体式到double,然后比较该铸造的结果来完成的。注意从longdouble该转换可以是不精确的,如果数在该范围之外±2 52 。然而,在之前的64位long变得可用的日子里,double是为整数数量,其是太大了32位int但小到足以通过double处理。一个方便的存储类型

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top