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


103

公式のJavadoc 、「数学的整数と等しい」をMath.floor()返すと言っていますdoubleが、なぜそれを返さないのintですか?

回答:


80

同じJavadocによると:

引数が、NaNまたは無限大、正のゼロ、または負のゼロの場合、結果は引数と同じになります。でそれを行うことはできませんint

最大double値は最大値よりも大きいintため、でなければなりませんlong


40
Math.Round関数と矛盾しているようです。これらはint / longを返し、特殊なケースを別の方法で処理します。
zod

1
Javadocは、「引数以下で数学的整数に等しい最大(正の無限大に最も近い)*浮動小数点値*」を返すとJavadocが言っていることに注意してください。x> 2 ^ 53という値が与えられた場合、小数部が切り捨てられた値とは異なります。それはそれよりかなり小さいかもしれません。
ジムギャリソン

16

精度のためです。doubleデータ型には、53ビットの仮数があります。特に、doubleは、精度を失うことなく、2 ^ 53までの全体を表すことができます。

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

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


もちろん、そのような値に対処するためにlongを返す可能性があります。ただし、2 ^ 63を超えるdoubleをどうするかを考え出す必要があります。
Jon Skeet、

1
@ジョン、本当ですが、それはパフォーマンスに影響を与えます(私が知っているどの命令セットでもlongからdoubleへの変換命令はありません)。そもそもMath.floorがdoubles> 2 ^ 53で何をしているのだろう。一部の結果は表現できません。
ニルスPipenbrinck

しかし、公式のjavadocにも表示される擬似イディオム形式(int)Math.floor(foo)は、結果がintに収まらない可能性があるため安全ではありませんか?そして再び、結果はlongに収まらない可能性があるため、Math.floorを使用するのに安全な形式ですか?
ライバズ2009

10

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

int a=(int) 1.5;

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

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

私の場合、これを実行したくありませんでした。次のコードを使用して丸めを行いましたが、すべてのエッジケースを適切に処理しているようです。

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

7
なぜ使用しないの(int) Math.floor(a)ですか?それはおそらくより効率的で、より短いです。
ソロモンUcko 2017

@Solomon Uckoの代わりに、aが正の場合、(int) Math.floor(a)単にと書くことができます(int) a
Leo Leontev

3

最大のintより長いdoubleまたはlongを指定した場合、何を返しますか?

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


0

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

double f = Math.floor(x);

または

int k = (int) x; 

ただし、有限精度の算術演算で床を使用する場合は常に注意する必要があります。xの計算では、1.999999999のようになり、両方の形式で2ではなく1に床される可能性があります。一部の入力値で誤った結果が生成されるのを回避するために、この制限を回避する必要のある多くのアルゴリズムがあります。


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.