# [ACCEPTED]-Why Math.Ceiling returns double?-ceil

`double`

has a greater value range than `int`

:

The Double 14 value type represents a double-precision 13 64-bit number with values ranging from 12 negative 1.79769313486232e308 to positive 11 1.79769313486232e308, as well as positive 10 or negative zero, PositiveInfinity, NegativeInfinity, and 9 Not-a-Number (NaN).

Double complies with 8 the IEC 60559:1989 (IEEE 754) standard 7 for binary floating-point arithmetic.

That 6 standard says that `double`

has a 52-bit mantissa, which 5 means it can represent any integer up to 4 52 bits long without loss of precision.

Therefore 3 if the input is large enough, the output 2 doesn't fit inside an `int`

(which only has 32 1 bits).

The documentation says about the return 6 value:

The smallest whole number greater 5 than or equal to a. If a is equal to NaN, NegativeInfinity, or 4 PositiveInfinity, that value is returned.

Therefore 3 the return value has to be double since 2 NaN, NegativeInfinity and PositiveInfinity 1 are fields of Double.

`Math.Ceiling`

can return either a `double`

or a `decimal`

, depending on 10 the type passed in. In other words, the 9 output type of the method matches the input 8 type (quite sensibly).

They could have added 7 a third overload that takes an `int`

and returns 6 an `int`

, but there wouldn't have been much point 5 to this - the function would always just 4 return its input.

You seem to be assuming 3 that the purpose of `Math.Ceiling`

is to cast a floating-point 2 value to an integer, but that's usually 1 not how it's used.

It has to return double in order to be complete. Any 8 math operation involving a NaN always returns 7 NaN. Thus if you pass a NaN to ceiling() function 6 one would not be able to return NaN, as 5 there is no equivalent in Int. Also given 4 that Double has a wider range what would 3 one return for those out of range integer 2 values ? What does one return for +/- inf 1 ?

Because `double`

can contain larger numbers than 2 `int`

or `long`

. Same reason there's no implicit cast 1 from `double`

to `int`

.

More Related questions

We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.