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