在C#中,为什么舍入数学函数Floor,Ceiling和Round不返回int
?考虑到函数的结果总是一个整数,为什么它会返回float
,double
或decimal
?
答案 0 :(得分:31)
double
has the range of ±5.0 × 10−324 to ±1.7 × 10308和long
has the range of –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807。不幸的是,所有整数浮点值都不能用整数表示。
例如,1e19
已超出64位有符号整数的范围。
(long)Math.Round(1e19) == -9223372036854775808L // WTF?
虽然单参数重载Math.Round(double)
和Math.Round(decimal)
总是返回一个整数值,但这些重载仍然不能返回整数值类型。
如果知道传递给函数的值将返回一个可由整数值类型表示的值,则可以自己进行转换。图书馆不会这样做,因为它需要考虑一般情况。
答案 1 :(得分:13)
答案 2 :(得分:2)
这样做的目的是包括大于int范围内的数字。 因此,Math.Floor将返回一个double,可以根据大小和开发人员将其转换为int或long。 如果你在int范围之外尝试过Math.Floor,那么如果Math.Floor返回一个int,它就会失败,但它没有,它会返回一个你可以强制转换为long的double。
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无法容纳它。