【问题标题】:Which is the best way to compare the integer part of two non-integer numbers?比较两个非整数的整数部分的最佳方法是什么?
【发布时间】:2008-10-25 12:30:33
【问题描述】:

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

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

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

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

谢谢。

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

关于匈牙利符号 cmets:

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

【问题讨论】:

    标签: .net integer double compare


    【解决方案1】:

    使用 Math.Truncate() 即

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

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

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

    【讨论】:

    • -2 和 -2.1 都 == -2 在演员表之后。
    • 积极的一面是,我认为您的方法更能描述代码的作用。
    • 老实说,我没有想到在 int 范围之外的 double->int 转换,为指出这一点而欢呼。
    【解决方案2】:

    是的,这是最好的方法。

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

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

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

    【讨论】:

    • 问题:(int)-4.1 是干什么的?
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • +.5 用于避免额外的变量,另外 0.5 用于提及匈牙利符号的初衷(使用语义而不是类型前缀)。
    • -.5 表示不回答问题,-.5 表示提出不相关的话题。 :)
    • @Trap:原发帖人问是否有“更好的方法来做到这一点”。奇怪的是,我回答了这个问题:)
    【解决方案4】:

    我同意 Truncate 是您想要的。

    来自MSDN的一些有用信息:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2011-08-11
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多