Math.Ceiling
会返回double
,因为double
可能会存储更多的数字。
但是,如果我确定int
类型能够存储结果,我应该如何转换?施放(int) Math.Ceiling(...
是否安全?
答案 0 :(得分:43)
如果您确定没有超过int的容量,那么
应该是完全安全的int myInt = (int)Math.Ceiling(...);
如果您不确定绑定,可以使用long
代替int
。
答案 1 :(得分:9)
从C ++实践中,我将使用以下内容。即使天花板返回99.99999 ... 8或100.000000 ... 1
,也能保证获得正确的结果var result = (int)(Math.Ceiling(value) + 0.5);
如果你相信它的实现,下面的代码也应该有用
var result = Convert.ToInt32(value);
答案 2 :(得分:4)
我会去
int x = (int)Math.Ceiling(0.9); // 1
答案 3 :(得分:3)
如果您不确定,您可以随时提出if语句并检查您获得的号码是否更高,然后int.MaxValue
答案 4 :(得分:3)
如果所有内容都与速度有关,则用于Int输入和输出的Math.Ceiling相当慢。最快的是内联表达式:
var ceilingResult = (value / divisor) + (value % divisor == 0 ? 0 : 1);
根据我自己的10M迭代基准,Math.Ceiling需要约2.4秒。在命名函数中调用此表达式大约需要380毫秒,将其作为直接内联表达式需要大约33毫秒。
如果您希望将Math.Floor用于Int输入和输出,则更加简单:
var floorResult = (value / divisor);
答案 5 :(得分:1)
int oInt = Convert.ToInt32(Math.Ceiling(value));
由于Math.Ceiling
返回double
并且您想将其转换为int
,请使用Convert
类。例如:
double[] values= { Double.MinValue, -1.38e10, -1023.299, -12.98,
0, 9.113e-16, 103.919, 17834.191, Double.MaxValue };
int result;
foreach (double value in values)
{
try {
result = Convert.ToInt32(value);
Console.WriteLine("Converted the {0} value '{1}' to the {2} value {3}.",
value.GetType().Name, value,
result.GetType().Name, result);
}
catch (OverflowException) {
Console.WriteLine("{0} is outside the range of the Int32 type.", value);
}
}
// -1.79769313486232E+308 is outside the range of the Int32 type.
// -13800000000 is outside the range of the Int16 type.
// Converted the Double value '-1023.299' to the Int32 value -1023.
// Converted the Double value '-12.98' to the Int32 value -13.
// Converted the Double value '0' to the Int32 value 0.
// Converted the Double value '9.113E-16' to the Int32 value 0.
// Converted the Double value '103.919' to the Int32 value 104.
// Converted the Double value '17834.191' to the Int32 value 17834.
// 1.79769313486232E+308 is outside the range of the Int32 type.