web-dev-qa-db-ja.com

Math.floorがdoubleを返すのはなぜですか?

公式のJavadoc saysMath.floor()は「数学的な整数に等しい」doubleを返しますが、なぜintを返さないのですか?

90
Raibaz

同じJavadocによると:

引数がNaNまたは無限大または正のゼロまたは負のゼロの場合、結果は引数と同じです。 intではできません。

最大のdouble値も最大のintよりも大きいため、longである必要があります。

73
krosenvold

精度のためです。 doubleデータ型には、53ビットの仮数があります。とりわけ、doubleは精度を損なうことなく最大2 ^ 53までのすべてを表現できることを意味します。

このような大きな数を整数に格納すると、オーバーフローが発生します。整数は32ビットのみです。

整数をdoubleとして返すことは、整数よりもはるかに広い有用な数値範囲を提供するため、ここでは正しいことです。

14

他の人はあなたに理由を教えました、あなたがこれをしたいのなら、私は正しく丸める方法を教えます。正数のみを使用する場合は、次のステートメントを使用できます。

int a=(int) 1.5;

ただし、(int)は常に0に向かって丸められます。したがって、負の数を実行する場合は、次のようになります。

int a=(int) -1.5; //Equal to -1

私の場合、これはしたくありませんでした。次のコードを使用して丸めを行いましたが、Edgeのすべてのケースをうまく処理できるようです。

private static long floor(double a)
{
    return (int) Math.floor(a);
}
6
PearsonArtPhoto

最大のintまたはlongよりも2倍大きい場合、何を返しますか?

(確かに、それが最大のlongよりも大きい場合、精度はとにかく低くなります-最も近い理論上の整数ではないかもしれません-しかし...)

3
Jon Skeet

Javaには整数と浮動小数点の除算があるように、floorを行うには整数と浮動小数点の方法があります。

double f = Math.floor(x);

または

int k = (int) x; 

ただし、有限精度の算術演算でfloorを使用する場合は常に注意する必要があります。xを計算すると、どちらの形式でも2ではなく1にフロアリングされる1.99999999のような結果になる場合があります。いくつかの入力値に対して誤った結果が生成されるのを避けるために、この制限を回避する必要がある多くのアルゴリズムがあります。

0
Pablo

そのため、エラーやその他の非整数値は、一連の計算を通じて正しくカスケードできます。

たとえば、Not a Number(NaN)をMath.floorに渡すと、それが渡されます。

整数が返された場合、これらのステータスまたはエラーを渡すことができず、前の計算からは見た目は良いが、その後の処理後に間違った悪い結果を得る可能性があります。

-アダム

0
Adam Davis