web-dev-qa-db-ja.com

Math.Floor(Double)がDouble型の値を返すのはなぜですか?

左側の整数値を10進数または2進数から取得する必要があります。例:4.6から値4を取得する必要があります。 Math.Floor関数を使用してみましたが、たとえば、4.6から4.0を返しているなど、double値を返しています。 MSDNドキュメントには、整数値が返されると書かれています。ここに何かが足りませんか?または、私が探しているものを達成する別の方法がありますか?

95
Sridhar

doubleの範囲は、intまたはlongの範囲よりもはるかに広いです。次のコードを検討してください。

double d = 100000000000000000000d;
long x = Math.Floor(d); // Invalid in reality

整数はlongの範囲外です-それで何が起こると思いますか?

通常、値は実際intまたはlongの範囲内であることを知っているので、キャストします。

double d = 1000.1234d;
int x = (int) Math.Floor(d);

しかし、そのキャストの責任は開発者にあり、Math.Floor自体にはありません。 longの範囲外のすべての値に対して例外を発生させて失敗させることは、不必要に制限されていたでしょう。

133
Jon Skeet

MSDNによると、Math.Floor(double)はdoubleを返します。 http://msdn.Microsoft.com/en-us/library/e0b5f0xb.aspx

あなたがintとしてそれをしたい場合:

int result = (int)Math.Floor(yourVariable);

MSDNの記事がどのように誤解を招く可能性があるかを見ることができますが、結果は「整数」(この場合は整数を意味します)でありながらTYPE Double

11
Neil N

数値の整数部分だけが必要な場合は、数値をintにキャストします。これにより、小数点で数値が切り捨てられます。

double myDouble = 4.6;
int myInteger = (int)myDouble;
4
Jon Seigel
Convert.ToInt32(Math.Floor(Convert.ToDouble(value)))

これにより、4.6を取得した場合に希望する正確な値が得られ、出力として4が返されます。

0
user3306645

それは正しいです。宣言を見ると、Math.Floor(double)はdoubleを生成します( http://msdn.Microsoft.com/en-us/library/e0b5f0xb.aspx を参照)。 「整数」とは「整数」を意味すると思います。

0
Jon Onstott

Floorはそれをdoubleのままにしておくので、さらに二重計算を行うことができます。 intとして必要な場合は、floorの結果をintとしてキャストします。元のdoubleをintとしてキャストしないでください。負数の場合、floorのルールが異なります(IIRC)。

0
plinth