Javaで倍精度を整数に変換する


114

Javaでは、doubleを整数に変換したいのですが、これを行うかどうかはわかります:

double x = 1.5;
int y = (int)x;

y = 1になります。これを行う場合:

int y = (int)Math.round(x);

おそらく2になるでしょう。しかし、私は疑問に思っています。整数の二重表現は1.9999999998のように見える場合があるため、Math.round()を介して作成されたdoubleをキャストしても、数値が切り捨てられる可能性があります。私たちが探している丸められた数よりも(つまり:表現されたコードでは2ではなく1)?

(そして、はい、私はそれ自体を意味します:xの値はありますか、yはxの丸められた表現ではなく切り捨てられた結果を示しますか?)

もしそうなら:切り捨てのリスクを冒すことなくdoubleを丸められたintにするためのより良い方法はありますか?


何か考えました:Math.round(x)はdoubleではなくlongを返します。したがって、Math.round()が3.9999998のような数値を返すことは不可能です。したがって、int(Math.round())は何も切り捨てる必要がなく、常に機能します。


6
Math.round(double)は、doubleではなくlongを返します。
qbert220

回答:


95

を介して作成されたdoubleをキャストしてMath.round()も、切り捨てられた数値になる可能性はありますか

いいえ、round()倍精度long浮動小数点数は常に正しい値に丸められ、次に小数点以下が切り捨てられるにキャストされます。ただし、丸めた後は、端数部分は残りません。

ここからのドキュメントですMath.round(double)

引数に最も近いlongを返します。結果は、1/2を加算し、結果のフロアを取り、結果をlong型にキャストすることにより、整数に丸められます。つまり、結果は式の値と等しくなります。

(long)Math.floor(a + 0.5d)

3
重要な点は、丸めが丸めメソッド内で行われることです。long値が返されます。これはintに安全にキャストできます(戻り値は常にintの範囲内にあると想定しています)。
qbert220

はい。/ long /が問題を与えることを想像することはできません。明らかに!これを理解していたはずです:(
vdMandele

1
丸めのために切り捨てが発生しないことは事実ですが、非常に大きい数であるdoubleから[max double: 1.7976931348623157E308]はるかに小さいint へのキャストのために、期待した結果が得られない場合があります[max int: 2147483647]。心に留めておくべきこと。
Nelda.techspiress

22

データ型Doubleto intには、次のものを使用できます。

Double double = 5.00;

int integer = double.intValue();

彼は丸められた値を探しています。
ローンの侯爵

1
私はそれはあなたが(ない5 4を与える)4.99999999999のために何を期待与えるとは思わない
murkle

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