[英]What's the best way to represent System.Double as a sortable string?
[英]What's the best way to compare Double and 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 来保持分数。
这实际上取决于您认为“平等”的内容。 如果您希望您的比较在且仅当 double 与整数值精确匹配时返回 true(即没有小数部分),您应该将 int 转换为 double 以进行比较:
bool isEqual = (double)iValue == dValue;
如果像 1.1 这样的东西被认为等于 1,你可以将 double 强制转换为 int(如果你想完全忽略小数部分),或者如果你想说 1.9 等于 2,则将 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 的最低可能值。
由于 Epsilon 定义了范围接近零的正值的最小表达式,因此两个相似值之间的差值幅度必须大于 Epsilon。 通常,它比 Epsilon 大很多倍。 因此,我们建议您在比较 Double 值是否相等时不要使用 Epsilon。
如果您没有使用 double 进行任何计算,则可以使用==
。 这是因为整数可以精确地用双精度表示(仅在 -2^53 和 2^53 之间)。
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue == dValue;
这返回真。
Equals
不起作用的原因是==
运算符会在比较之前自动将整数转换为 double,而Equals
不会,因此失败。
这个答案有更多信息: https : //stackoverflow.com/a/52525223/15714398
如果您已使用双精度数进行计算,则所有赌注都将取消,您必须对计算中的有效数字位数进行一些分析。
如今,几乎唯一一次应该比较double
类型的值和integer
或long
类型的值以实现严格相等的情况是,由于某种原因,人们被困在将整数作为浮点值存储或传递,然后需要将它们转换回来. 在大多数情况下,通过将整数类型转换为double
,然后比较该转换的结果,可以最容易地完成这种转换。 请注意,如果数字超出范围 ±2 52 ,则从long
到double
转换可能不精确。 尽管如此,在 64 位long
可用之前的日子里, double
是一种方便的整数存储类型,对于 32 位int
来说太大了,但又小到可以由double
处理。
需要注意的是转换long
到double
,然后做的比较将产生一个“平等”的结果,如果标称值double
不精确匹配的long
价值,但表示可能最接近的double
该值。 如果人们认识到浮点类型实际上并不表示单个精确值,而是表示一系列值,则这种行为是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.