C# 为什么';t数学。四舍五入返回整数?

C# 为什么';t数学。四舍五入返回整数?,c#,math,C#,Math,在C#中,舍入数学函数Floor、天花和Round为什么不返回int?考虑到函数的结果总是一个整数,为什么它会返回一个浮点、双精度或十进制?和。不幸的是,并非所有的整型浮点值都可以用整数表示 例如,1e19已超出64位有符号整数的范围 (long)Math.Round(1e19) == -9223372036854775808L // WTF? 虽然单参数重载Math.Round(double)和Math.Round(decimal)将始终返回整数值,但这些重载仍然不能返回整数值类型 如果您知

在C#中,舍入数学函数Floor、天花和Round为什么不返回
int
?考虑到函数的结果总是一个整数,为什么它会返回一个
浮点
双精度
十进制

和。不幸的是,并非所有的整型浮点值都可以用整数表示

例如,
1e19
已超出64位有符号整数的范围

(long)Math.Round(1e19) == -9223372036854775808L // WTF?
虽然单参数重载
Math.Round(double)
Math.Round(decimal)
将始终返回整数值,但这些重载仍然不能返回整数值类型

如果您知道传递给函数的值将返回一个可由整数值类型表示的值,您可以自己强制转换它。图书馆不会这么做,因为它需要考虑一般的情况。

考虑到函数的结果总是一个整数

不会的。您甚至可以使用

数字类型:
System.Int32
返回值中的小数位数


这样做是为了包含大于整数范围内包含的数字。 因此Math.Floor将返回一个双精度,可以根据大小和开发者将其转换为int或long。 如果您尝试Math.Floor超出int范围,则Math.Floor返回int可能会失败,但它没有返回,它返回一个可以转换为long的双精度

     double d = 4147483647.5678;
     long a = (long)Math.Floor(d);
     int b = (int)Math.Floor(d);
     Console.WriteLine(a);
     Console.WriteLine(b);

请注意,在转换为int时,b被推回MIN int,因为int无法容纳它。

Round被重载,返回类型必须与启动器匹配;p调用
Math.Round(1E30)
,它返回一个
int
,会发生什么?那么你是说BCL的工作是确定你想要的结果是什么?对于
Math.Round()
来说,返回与其参数相同的类型是有意义的。一个更好的问题是,为什么没有用于
Math.RoundToInt32
Math.RoundToInt64
Math.FloorToInt32
、和
Math.FloorToInt64
、性能和稳定性的函数呢?+1事实上,因为并非所有时候我们都需要轮换到一个intI,所以轮换的文档说,在这里我们不得不保持沉默“返回最接近a的整数”-你是说它并不总是返回整数。这似乎没有意义。@PandaWood,你在哪里看到“返回最接近的整数?”" ? 我找不到,你能分享一下链接吗。如果您指的是最接近a的整数。如果a的分数部分位于两个整数的中间,其中一个是偶数,另一个是奇数,则返回偶数。请注意,此方法返回的是双精度而不是整数类型。然后请注意最后一部分。@Habib好的,谢谢,出于某种原因,我没有看到最后一部分。请注意,有些长整数不能表示为双精度:
(Double)1000000000000001L==1e17
(和
1e17==1e17+1
)。@AntalS-Z yep。为了获得更高的精度,使用类型更好。