如何将Math.Ceiling结果转换为int?

时间:2012-01-12 09:49:25

标签: c#

Math.Ceiling会返回double,因为double可能会存储更多的数字。 但是,如果我确定int类型能够存储结果,我应该如何转换?施放(int) Math.Ceiling(...是否安全?

6 个答案:

答案 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.