在C#下面的代码无法正常工作:
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
所以,问题:什么是比较双人和Int的最佳方式?
在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双做比较:
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
,要么integer
或long
严格相等时,由于某种原因,一个是卡存储或通过积分量为浮点值和以后需要将其转换回。 这样的转换可在大多数情况下最容易地通过铸造整体式来完成的double
,然后比较该铸造的结果。 注意从转换long
到double
可以是不精确的,如果数是范围±2 52的外侧。 尽管如此,前64位的天long
面世, double
是为整数量这是太大的一个32位的一个方便的存储类型int
但小到足以通过处理double
。
需要注意的是转换long
到double
,然后做的比较将产生一个“平等”的结果,如果标称值double
不精确匹配的long
价值,但表示可能最接近的double
该值。 这种行为很有道理,如果人们意识到浮点类型实际上并不代表一个单一的精确值,而是一个范围值。