0

引数として2つの整数を取り、返すメソッドがあります:

 public int method(int a, int b){
   return Math.round((Math.abs(a-b)/3) - (Math.min(a,b)-1500)/10)
 }

値 1400 と 1500 (期待値は 43) で合格する単体テストを作成しましたが、1459 と 1500 では失敗します。期待される出力は 18 ですが、メソッドは 17 を返します。これは丸めと関係があると思います。 、ただし、明らかなエラーは表示されません。17.7(6) を 18 に丸めることに問題はありません。

編集:

実際の関数はわずかに異なっていました (私は Math.abs(ab) を持っていませんでしたが、代わりに、この結果として "diff" 変数を定義しました。私はそれを double diff として宣言したことを皆さんに約束することができました; - 私にはわかりません)なぜint diffになるのですか:)解決済みありがとう:)

4

5 に答える 5

4

Math.absどちらも s を引数として渡すとs をMath.min返すため、コードは、予想される二重除算ではなく整数除算を行っています。とをとに置き換えると、コードは期待どおりに動作するはずです。intint3103.010.0

于 2011-09-11T17:05:58.803 に答える
2

整数除算を行っているためです。でa = 1459b = 1500:

Math.round((Math.abs(a-b)/3) - (Math.min(a,b)-1500)/10)
Math.round(Math.abs(41)/3 - (1459-1500)/10)
Math.round(41/3 - (-41)/10)
Math.round(13 - (-4))
Math.round(17)       // note that round will always get an integer as input
17

簡単な修正方法は、float を引数の 1 つとして使用して、代わりに浮動小数点除算を実行するように強制することです。

Math.round((Math.abs(a-b)/3.0) - (Math.min(a,b)-1500)/10.0)
于 2011-09-11T17:07:08.707 に答える
1

整数除算を使用するときに double を期待することは、本の中で最も古い落とし穴でなければなりません。;)

整数除算は整数結果を生成するため、ラウンドは何もしません。

于 2011-09-11T17:06:18.980 に答える
0

予想される結果は 17 です。

|a-b| = 41
|a-b|/3 = 13

min(a,b) = 1459
min(a,b)-1500 = -41
(min(a,b)-1500)/10 = -4

13-(-4) = 17

整数除算はしたくないと思います。3したがって、 と103.0と で置き換える必要があり10.0ます。

于 2011-09-11T17:07:56.063 に答える
0

Java で整数を別の整数で除算すると、結果は浮動小数点数ではなく整数になる (剰余は破棄される) という事実を考慮する必要があります。たとえば6/4 == 1、そうではありません1.5

メソッド(1459、1500)

Math.round((Math.abs(1459-1500)/3) - (Math.min(1459,1500)-1500)/10);
Math.round((41/3) - (1459-1500)/10);
Math.round(13 - (-41)/10); //41/3 == 13, not 13.6666
Math.round(13 - -4); //-41/10 == -4, not -4.1
Math.round(17);
17
于 2011-09-11T17:18:18.277 に答える