2008-10-25 83 views
2

我需要两个双打不平等的整数部分比较,目前我在做这个:哪个比较两个非整数的整数部分的最好方法是?

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

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

,但我不知道是否有比这更好的办法。

谢谢。

如果我使用Math.Truncate()而不是转换为int,那么将比较两个相等的double值是否准确?

关于匈牙利命名法的意见:

我从来没有使用HN自己,而不是至少在像大多数人做。但是,这是一个变量的语义与其类型直接相关的罕见情况之一。我可以选择另一种语法,比如A_As_Integer和B_As_NonInteger,但是那会是什么区别呢?

回答

7

使用Math.Truncate()即

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

[编辑]意识到,如果您比较双打的整数部分,铸造为int值首先运行溢出的风险,你应该是翻倍的范围之外的可以表示为int。

截断返回一个十进制或一个双重,避免此问题。

4

是的,那是最好的办法。

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

即。 (int)4.1将给出与(int)相同的结果4.9

正如Ovid所述,如果您只需要变量进行比较,那么您只需要在比较语句中输入双精度。我只是在看这个理论。

+0

问题:(int)-4.1会去什么? – biozinc 2008-10-25 12:37:48

+0

它将等于-4 – Inisheer 2008-10-25 12:39:05

1

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

随着代码随着时间的推移而发生变化,有额外的变量悬而未决会导致混淆。当然,如果你需要这些变量,这是另一个问题:)

附注:你似乎试图通过简单的匈牙利符号暗示数据类型。我可以建议不要那样做吗?如果你必须给你的变量添加前缀信息,试着用变量的前缀而不是它的类型作为前缀。如果你这样做,在代码中的错误可以更容易地看到:

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

在这种情况下,甚至不知道数据是什么,看到你要比较的“年龄”与“ID”这是一个很好的线索,说明这里有什么不对。

+0

+.5,用于避免额外的变量,以及提及匈牙利符号的初始意图(使用语义而不是类型前缀)的另外0.5个加分。 – OregonGhost 2008-10-25 12:38:30

1

我同意Truncate是你想要的。

MSDN一些有用的信息:

截断返回残留的任何小数位被废弃以后的数量。

它向四舍五入到最接近零的整数。

double floatNumber; 

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

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