代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

为什么不呢Math.Round/Floor/Ceiling 返回long还是int?

  •  23
  • TheCloudlessSky  · 技术社区  · 14 年前

    Math.Round/Floor/Ceiling 我总是投给 int long 如有必要)。他们到底为什么回来 double

    4 回复  |  直到 14 年前
        1
  •  30
  •   Mark Byers    12 年前

    双精度近似范围:±五点零一零 324 至±一点七一零 308

    (Source)

        2
  •  8
  •   dan04    14 年前

    long ,但你可能会想:如果C#有一个更长的时间呢 类型?好吧,下面是Python中任意长度整数的情况:

    >>> round(1.23e45)
    1229999999999999973814869011019624571608236032
    

    大多数数字都是浮点舍入误差产生的“噪声”。也许是 Round Floor / Ceiling 返回 double 在C#是为了避免错误精确的错觉。

    另一种解释是.NET Math 模块使用C语言编写的代码,其中 floor ceil 返回浮点类型。

        3
  •  2
  •   Dave Clemmer manu    12 年前

    floor() . 或者自己写代码。的C库版本 ceil() 反正速度很慢。

    我更希望在函数中进行范围检查(如果需要避免溢出)并返回long。对于我自己的私有代码,我可以跳过范围检查。我一直在这样做:

    long int_floor(double x)
    {
        double remainder;
        long truncate;
        truncate = (long) x;        // rounds down if + x, up if negative x
        remainder = x - truncate;   // normally + for + x, - for - x
        //....Adjust down (toward -infinity) for negative x, negative remainder
        if (remainder < 0 && x < 0)
            return truncate - 1;
        else
            return truncate;
    }
    

    细胞() round()

        4
  •  -2
  •   bwawok    14 年前

    在我能找到的文件上没有给出任何理由。我最好的猜测是,如果你使用双打,很可能你会希望双打上的任何操作返回双打。语言设计者认为,把它四舍五入转换成int比把它四舍五入和保持为double更不常见。

    您可以编写自己的方法,用大约2行代码将其转换为int,这比在堆栈溢出上发布问题要省力得多。。。