为什么Math.Round/Floor/Ceiling不返回long或int?

The*_*Sky 22 .net c#

每次我使用Math.Round/Floor/Ceiling我总是施放int(或者long如果必要的话).double如果它总是返回一个整数,为什么它们会返回.

Mar*_*ers 29

结果可能不适合int(或long).双倍的范围要大得多.

双倍的近似范围:±5.0×10 -324至±1.7×10 308

(资源)

  • 重点仍然是一样的.`double`可以大于9223372036854775807. (3认同)
  • @ dan04:是的,但只有低于2 ^ 52的双精度可以有非零小数部分,所以该函数通常仅在已知数字的动态范围低于该值的情况下才有用.我认为更大的问题是,想要将浮点类型转换为舍入整数类型的代码可能就像`Int32`作为`Int64`一样,并且没有明智的方法来使用重载来传达它.Java重载`round(double)`返回`long`,但`round(float)`返回`int`,带有好奇的效果,在超长2 ^ 31的`long`上调用`round`会将其挂起. .. (2认同)

dan*_*n04 8

我同意Mark的回答,结果可能不适合a long,但你可能想知道:如果C#有更长的long类型怎么办?好吧,这是Python中使用它的任意长度整数所发生的事情:

>>> round(1.23e45)
1229999999999999973814869011019624571608236032
Run Code Online (Sandbox Code Playgroud)

大多数数字是来自浮点舍入误差的"噪声".在C#中返回Round/ Floor/ Ceiling返回的动机的一部分可能double是为了避免错误精确的错觉.

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