26

Javaアプリケーションでこの簡単な計算を試みています:

System.out.println("b=" + (1 - 7 / 10));

明らかに、出力が になることを期待していますがb=0.3、実際にはそうではありませんb=1

何?!なぜこれが起こるのですか?

私が書く場合:

System.out.println("b=" + (1 - 0.7));

という正しい結果が得られますb=0.3

ここで何がうまくいかないのですか?

4

5 に答える 5

67

整数除算を使用しています。

7.0/10代わりに試してください。

于 2010-05-26T00:30:42.757 に答える
29

式 7/10 で整数を使用しましたが、整数 7 を整数 10 で割るとゼロになります。

あなたが期待しているのは、浮動小数点除算です。次のいずれかは、期待どおりに評価されます。

7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
于 2010-05-26T00:33:34.803 に答える
11

これを質問への回答と見なさないでください。そうではありませんが、int と float の違いを利用するためのアドバイスです。回答ボックスでこのコメントをフォーマットできることを除いて、これをコメントの下に置きます。

この機能は、fortran の時代 (またはそれ以前) から、すべての優れたプログラミング言語で使用されてきました。

たとえば、10/3 の整数除算では整数値 3 が得られます。これは、整数には小数残差 .3333.. を保持する機能がないためです。

私たち (古代のプログラマー) がこの機能を使用していた方法の 1 つは、ループ制御です。

1000 個の文字列の配列を出力したいが、15 文字列ごとに改行を挿入して、行末と次の行の先頭にいくつかのきれいな文字を挿入したいとします。整数 k がその配列内の文字列の位置であることを考えると、これを利用します。

int(k/15)*15 == k

は、k が 15 で割り切れる場合 (15 セルごとの頻度で発生) にのみ真です。これは、亡くなった祖父の時計が 1 日に 2 回正確であるという私の友人の言葉に似ています。

int(1/15) = 0 -> int(1/15)*15 = 0
int(2/15) = 0 -> int(2/15)*15 = 0
...
int(14/15) = 0 -> int(14/15)*15 = 0
int(15/15) = 1 -> int(15/15)*15 = 15

int(16/15) = 1 -> int(16/15)*15 = 15
int(17/15) = 1 -> int(17/15)*15 = 15
...
int(29/15) = 1 -> int(29/15)*15 = 15
int(30/15) = 2 -> int(30/15)*15 = 30

したがって、ループ、

leftPrettyfy();
for(int k=0; k<sa.length; k++){
  print(sa[k]);
  int z = k + 1;
  if ((z/15)*15 == z){
    rightPrettyfy();
    leftPrettyfy();
  }
}

ループ内で奇抜な方法で k を変化させることにより、三角形のプリントアウトを出力できます。

1
2  3
4  5  6
7  8  9  10
11 12 13 14 15

これは、これをバグと見なす場合、この「バグ」は、これまで使用してきたさまざまな言語のいずれからも削除したくない便利な機能であることを示すためのものです。

于 2010-05-26T06:11:39.770 に答える
1

文字識別子の方が読みやすく、解析された型をより示していることがわかりました。

1 - 7f / 10
1 - 7 / 10f

また:

1 - 7d / 10
1 - 7 / 10d
于 2010-05-26T01:46:49.670 に答える
1

私の場合、私はこれをしていました:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));

「正しい」の代わりに:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);

括弧に注意してください。

于 2017-01-12T11:01:57.917 に答える