【问题标题】:Why does C# Math.Floor() return Double instead of Int [duplicate]为什么 C# Math.Floor() 返回 Double 而不是 Int [重复]
【发布时间】:2010-11-09 05:09:18
【问题描述】:

可能重复:
Why does Math.Floor(Double) return a value of type Double?

为什么 C# Math.Floor() 返回 double 而不是 int

来自 MSDN 文档:

返回小于等于指定双精度浮点数的最大整数

它说它返回一个整数。可以返回double,我总是可以将其转换为int,但这很奇怪,不是吗?

【问题讨论】:

  • 措辞不好。可以说它应该说“整数”(或其他内容,甚至在注释中)以避免与 integer 数据类型产生歧义。但是,integer 是一个数学术语,因此虽然在这里令人困惑,但在技术上是正确的。

标签: c#


【解决方案1】:

并非如此,考虑到double 的量级可能比int 高得多。您不希望使用 double 可能的大值溢出 int。

只是为了告诉你我的意思:

Double.MaxValue = 1.7976931348623157E+308

整数.MaxValue = 2,147,483,647

所以你可以有一个 3,000,000,000.50 的双精度数并将其取底,这会溢出 int 的最大值。

【讨论】:

  • 这很好地解释了为什么它是有道理的......虽然它的解释要简单得多——FPU 结果是double。由于很多时候您想将其用作double(可能从参数中减去它以获得小数部分),因此将其转换然后必须将其转换回来是没有意义的。
  • @Ben Voigt - 也是一个好点,但没有解释为什么返回的值不能是整数类型,因为文档接近建议。仅仅因为 FPU 输出某些东西并不意味着方法需要返回该结果,尤其是在非本机运行时环境中。 MSDN 文档可能应该使用短语“integral part”或类似的东西来避免与类型名称混淆。
  • 如果它是一个大小的东西,他们肯定可以返回一个 long / Int64 吗?
  • 我同意@userx,我们也可以考虑转换的成本,一个整数存在于双域中,反之则不然,所以最好将整数表示为双精度而不是.
  • @mynye - 即使是 Long / Int64 也不够大。 Int64 的 MaxValue 为 9,223,372,036,854,775,807,即 9E+18。双倍可以大到 1E+308,这要大很多。原因是双精度(和单数/小数)的部分结构表示分数的指数。双打和整数是非常不同的,并且服务于非常不同的目的。我不会说将 int 表示为双精度会更好,因为在某些情况下双精度可能不太精确(我不确定,双精度的分数为 53 位,对于一个虽然)。
【解决方案2】:

因为 INPUT 是双精度,所以 OUTPUT 也必须是双精度,否则很多潜在的输出将无法放入输出变量中。

用数学术语来说,函数的范围必须具有相同的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多