在C#中,为什么不舍去数学函数Floor,Ceiling和Round返回一个int
?考虑到函数的结果总是一个整数,为什么它会返回一个float
,double
或decimal
?为什么Math.Round不返回int?
回答
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)
总是会返回一个整数值,这些重载仍不能返回一个整数值类型。
如果你知道传递给函数的值将返回一个可以用整型值类型表示的值,你可以自己强制转换。图书馆不会这样做,因为它需要考虑一般情况。
但是,请注意,有很长的整数* *不能表示为双精度:'(double)100000000000000001L == 1e17'(和'1e17 == 1e17 + 1')。 –
@ AntalS-Z是的。对于更大的先例,使用['decimal'](http://msdn.microsoft.com/zh-cn/library/364x0z75(v = vs80).aspx)类型更好。 –
+1事实上,由于不是所有时间我们需要舍入到int – V4Vendetta
我不禁要在这里愚蠢,圆的文档说“返回最接近的整数” - 你说它并不总是返回一个整数。这似乎没有道理。 – PandaWood
@PandaWood,你在哪里看到“返回最接近的整数”?我找不到它,请分享链接。如果你指的是这个“最接近的整数”。如果a的小数部分在两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。请注意,此方法返回一个Double而不是一个整型。然后注意最后一部分。 – Habib
这样做的目的是包含大于int范围内包含的数字。 因此,Math.Floor将返回一个可以根据大小和开发人员转换为int或long的double。 如果您尝试Math.Floor在int范围之外,如果Math.Floor返回一个int值,但它不会返回一个double值,您可以将其转换为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不能适应它。
- 1. Math.Round/Floor/Ceiling为什么不返回long或int?
- 2. 为什么我不能叫Math.Round(双,INT)超载
- 3. 为什么aspect要返回int类型?
- 4. 的Python为什么INT(“0”)返回false
- 5. 为什么string :: compare返回一个int?
- 6. 为什么+“1”返回一个int?
- 7. 为什么(int)(33.46639 * 1000000)返回33466389?
- 8. 为什么char连接返回“int”sum?
- 9. 为什么INT返回0 - C++
- 10. ExecuteNonQuery返回什么int值
- 11. Math.round返回NaN的
- 12. C#Double不受Math.Round影响 - 为什么?
- 13. 为什么将Double转换为Int不会在Swift中返回可选的Int?
- 14. 为什么不phantomjs返回
- 15. 为什么grep什么都不返回?
- 16. 为什么math.Ceiling(double a)不能直接返回int?
- 17. 为什么我的方法不返回一个int?
- 18. 为什么HttpException.GetHttpCode()返回一个int而不是System.Net.HttpStatusCode?
- 19. 为什么(INT)@ “ - 1” 的floatValue]不返回-1
- 20. 为什么python statistics.mean()返回一个int类型,而不是float
- 21. 为什么CountDownLatch.getCount()返回一个long而不是int?
- 22. 不知道为什么程序返回一个int
- 23. 为什么我的函数返回一个Unit而不是Int?
- 24. 为什么Random.Next()返回int而不是uint?
- 25. 为什么math.Pow10(e int)返回float64而不是int64?
- 26. 为什么PHP返回的字符串,而不是INT
- 27. 为什么printf在C中返回int而不是size_t
- 28. 为什么C#Math.Floor()返回的双重不是int
- 29. 为什么getActualTypeArguments返回Object而不是Integer for Option [Int]?
- 30. 为什么InputStream read()返回一个int而不是一个short?
Round重载,并且返回类型必须匹配初始者; p – leppie
想象一下,您调用'Math.Round(1E30)'并返回一个int,会发生什么? –
所以你说这是BCL的工作来确定你想要的结果是什么? –