2

我需要比较两个双精度的整数部分是否不相等,我目前正在这样做:

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

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

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

谢谢。

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

关于匈牙利符号评论:

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

4

4 回答 4

7

使用 Math.Truncate() 即

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

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

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

于 2008-10-25T12:42:14.650 回答
4

是的,这是最好的方法。

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

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

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

于 2008-10-25T12:36:00.437 回答
1

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

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

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

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

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

在这种情况下,甚至不知道数据是什么,看到您正在尝试将“年龄”与“身份证”进行比较,这是一个很好的线索,表明这里有问题。

于 2008-10-25T12:36:30.217 回答
1

我同意截断是你想要的。

来自MSDN的一些有用信息:

截断返回任何小数位被丢弃后剩余的数字。

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

double floatNumber;

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

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
于 2008-10-25T13:34:37.847 回答