135

私はこのコードを書いていました:

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

結果は 0 です。これはなぜですか?また、この問題を解決するにはどうすればよいですか?

4

17 に答える 17

173

2 つのオペランド (1 と 3) は整数であるため、整数演算 (ここでは除算) が使用されます。結果変数を double として宣言すると、除算後に暗黙的な変換が発生するだけです。

もちろん、整数除算は、ゼロに向かって丸められた除算の真の結果を返します。したがって、ここでは の結果は0.333...0 に切り捨てられます。(プロセッサは実際には丸めを行わないことに注意してください。ただし、そのように考えることができます。)

また、両方のオペランド (数値) が float として指定されている場合にも注意してください。3.0 と 1.0、または最初0.333....

于 2011-01-13T21:27:07.147 に答える
29

1/3両辺が整数であるため、整数除算を使用します。

少なくとも 1 つがfloatまたはである必要がありdoubleます。

質問のようにソースコードに値を入力している場合は、次のことができます1.0/3。は1.0ダブルです。

他の場所から値を取得する場合は、 を に変換するために使用(double)できintますdouble

int x = ...;
int y = ...;
double value = ((double) x) / y;
于 2011-01-13T21:31:09.227 に答える
10

明示的にキャストするdouble

double g = 1.0/3.0

これは、Java が と を整数定数として入力したため、整数除算演算を使用するために発生し1ます3

于 2011-01-13T21:26:27.987 に答える
3

整数除算を行っているためです。

@Noldorin が言うように、両方の演算子が整数の場合、整数除算が使用されます。

結果 0.33333333 は整数として表すことができないため、整数部分 (0) のみが結果に割り当てられます。

演算子のいずれかがdouble/のfloat場合、浮動小数点演算が行われます。しかし、そうすると同じ問題が発生します。

int n = 1.0 / 3.0;
于 2011-01-13T21:28:41.083 に答える
2

あなたが使用する必要があります

double g=1.0/3;

また

double g=1/3.0;

整数除算は整数を返します。

于 2011-01-13T21:35:10.533 に答える
1

1 と 3 は整数定数であるため、Java は整数除算を行い、結果は 0 になります。倍精度定数を書きたい場合は、and と書く必要が1.0あり3.0ます。

于 2011-01-13T21:28:32.753 に答える
1

1 と 3 を整数として扱い、結果を 0 に切り捨てて整数にするためです。

探している結果を得るには、次のように数値が double であることを Java に明示的に伝えます。

double g = 1.0/3.0;
于 2011-01-13T21:28:43.907 に答える
1

1 を float にすると、float 除算が使用されます

public static void main(String d[]){
    double g=1f/3;
    System.out.printf("%.2f",g);
}
于 2011-01-13T21:28:51.380 に答える
0
public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

1 と 3 は両方とも int であるため、結果は丸められず、切り捨てられます。したがって、分数を無視して、全体のみを取ります。

これを避けるには、数字の 1 または 3 の少なくとも 1 つを小数形式の 1.0 および/または 3.0 にします。

于 2018-06-22T18:51:57.927 に答える
-1

他の多くの人は、本当の問題を指摘できませんでした:

整数のみの操作は、操作の結果を整数にキャストします。

これは必然的に、整数として表示される可能性のある浮動小数点の結果が切り捨てられることを意味します (小数部分が切り取られます)。

あなたが尋ねるキャスト(型キャスト/型変換)とは何ですか?

言語の実装によって異なりますが、ウィキペディアにはかなり包括的な見解があり、強制についても言及されています。これは、質問に答える上で重要な情報です。

http://en.wikipedia.org/wiki/Type_conversion

于 2011-01-13T21:35:32.293 に答える
-1

「double g=1.0/3.0;」を実行します。代わりは。

于 2011-01-13T21:28:37.770 に答える