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



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

int iA = (int)dA;
int iB = (int)dB;
if( iA != iB )
{
    ...
}

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

谢谢。

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

关于匈牙利符号注释:

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

使用 Math.Truncate() 即

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

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

截断返回十进制或双精度,避免此问题。

是的,这是最好的方法。

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

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

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

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

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

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

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

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

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

我同意截断是你想要的。

MSDN 提供的一些有用信息:

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

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

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

相关内容

  • 没有找到相关文章

最新更新