哪个是比较两个非整数的整数部分的最佳方法?

时间:2008-10-25 12:30:33

标签: .net integer double compare

我需要比较两个双精度的整数部分的不等式,我现在正在这样做:

int iA = (int)dA;
int iB = (int)dB;

if( iA != iB )
{
    ...
}

但我想知道是否有比这更好的方法。

感谢。

如果我使用Math.Truncate()而不是使用强制转换为int,那么比较两个得到的双精度值是否仍然准确?

关于匈牙利符号评论:

我自己从未使用过HN,至少与大多数人的做法无关。但这是一种罕见的情况,其中变量的语义与其类型直接相关。我本可以选择另一种语法,如A_As_Integer和B_As_NonInteger,但那会有什么不同呢?

4 个答案:

答案 0 :(得分:7)

使用Math.Truncate()即

if (Math.Truncate(x) == Math.Truncate(y))

[编辑]意识到如果你要比较双精度的整数部分,如果你的双精度超出了可以表示为int的范围,那么转换为int值会首先冒溢出的风险。

Truncate返回Decimal或double,避免了这个问题。

答案 1 :(得分:4)

是的,这是最好的方法。

假设你在问题中的措辞,你不担心四舍五入...只是整数部分本身。

即。 (int)4.1将给出与(int)4.9

相同的结果

正如Ovid所说,如果您只需要变量进行比较,那么您只需要在比较语句中转换双精度数。我只关注这个理论。

答案 2 :(得分:1)

就个人而言,除非我需要,否则我会尽量避免创建额外的变量。

if ( (int)dA != (int)dB ) {
    ...
}

随着代码的发展,随着时间的推移,额外的变量无意中会导致混淆。当然,如果您需要这些变量,那就是另一个问题:)

旁注:您似乎试图通过简单的匈牙利表示法来暗示数据类型。我可以建议不这样做吗?如果必须为变量添加前缀信息,请尝试为变量的前缀添加前缀,而不是其类型。如果这样做,代码中的错误可以更容易看到:

if ( (int)ageA != (int)idB ) {
    ...
}

在这种情况下,甚至不知道数据是什么,看到你试图将'年龄'与'id'进行比较是一个很好的线索,这里有些问题。

答案 3 :(得分:1)

我同意Truncate就是你想要的。

来自MSDN的一些有用信息:

Truncate返回丢弃任何小数位后剩余的数字。

它向最接近的整数舍入为零。

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));