39

C# では、丸め数学関数の Floor、Ceiling、Round が を返さないのはなぜintですか? 関数の結果が常に整数になることを考えると、なぜfloat,doubleまたはを返すのdecimalでしょうか?

4

3 に答える 3

36

doubleの範囲は ±5.0 × 10 −324から ±1.7 × 10 308long、範囲は –9,223,372,036,854,775,808 から 9,223,372,036,854,775,807です。残念ながら、すべての整数浮動小数点値を整数で表現できるわけではありません。

たとえば、1e19すでに 64 ビットの符号付き整数の範囲を超えています。

(long)Math.Round(1e19) == -9223372036854775808L // WTF?

Math.Round(double)単一引数のオーバーロードが常に整数値を返すことは事実ですがMath.Round(decimal)、これらのオーバーロードは依然として整数値型を返すことはできません。

関数に渡される値が整数値型で表現可能な値を返すことがわかっている場合は、それを自分でキャストできます。一般的なケースを考慮する必要があるため、ライブラリはそれを行いません。

于 2013-02-08T05:24:08.033 に答える
13

関数の結果が常に整数になることを考慮すると、

いいえ、そうではありません。Math.Round Method (Double, Int32)で桁数を指定することもできます

digits 型:
System.Int32
戻り値の小数桁数。

于 2013-02-08T05:24:26.843 に答える
2

これは、int の範囲に含まれる数よりも大きな数を含めるために行われます。したがって、Math.Floor は、サイズと開発者に基づいて int または long にキャストできる double を返します。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 が対応できないためです。

于 2013-02-08T05:25:16.327 に答える