3

Javaで次の数学方程式を実行しようとしています:

(44334*(220*220))+ (81744*220) + 39416)

WolframAlpha (または Google) で同じ方程式を入力すると、次のようになります。

2163788696

Javaでは負の数が得られます..

なぜこれが起こっているのかを見つけるのに苦労していますが、運がありません。また、答えを BigInteger に保存しようとしましたが、桁が大きすぎるため、負の値が得られます。

私は何をすべきか?

4

6 に答える 6

6

編集:整数のラップアラウンドを処理するには、:を使用しlongます

System.out.println("Result: " +
    (44334L * 220 * 220 + 81744 * 220 + 39416));  // 2163788696

プラス演算子は左結合であるため(文字列の連結または加算に使用されているかどうかに関係なく)、算術式全体が括弧で囲まれていない場合、部分式の結果が左から右に個別の文字列として連結されます。

左側のオペランドは、+を文字列の連結または加算のどちらに使用するかを決定します。この場合、最初のオペランドは文字列であるため、右側((44334*(220*220)))も文字列に変換されます。最初の+演算子の結果は文字列であり、別の+文字列連結操作の左側として使用されます。次のオペランド((81744*220))は再び文字列に変換されます。

これを回避するために、算術式全体を括弧で囲むことができます。

于 2012-12-30T21:57:53.787 に答える
2

問題は、式が左から右に評価されるという事実によるものです。最初の値は文字列型であるため、+演算子は、数学的な加算演算子ではなく、文字列連結演算子になります。式(44334*(220*220))(81744*220)は評価されて文字列に変換され、誤った結果になります。式全体を括弧で囲むと、結果が正しく計算され、正しい結果が表示されます。

于 2012-12-30T21:58:48.597 に答える
2

現在、あなたがしていることは以下と同等です:

System.out.println(("result="+(44334*220*220)) + (81744*220 + 39416) );
// = "result=2145765600" + 18023096
// = "result=214576560018023096"

括弧は重要です!修正されたコードは次のとおりです。

System.out.println("result=" + (44334*220*220+ 81744*220 + 39416) );
// = "result=2163788696"

編集:

また、自動intキャストにも注意してください。long結果が よりも大きいMAX_INT(ただし、 よりも小さいMAX_LONG)ため、を使用します9223372036854775807

(long)((long)44334*220*220 + (long)81744*220 + 39416)

または、数字のL後に接尾辞を付けます (そのため、数字は s と見なされますlong)。

于 2012-12-30T21:59:58.160 に答える
1

問題は+、Java の演算子がオーバーロードされていることです。文字列連結または数値加算のいずれかを意味します。何が起こっているかというと、いくつかの+操作が数値の加算ではなく文字列の連結として扱われているということです。

式の前後に一連の括弧を追加する必要があります。

System.out.println("result="+((44334*(220*220))+ (81744*220) + 39416)); 

または一時変数を使用します。

int res = (44334*(220*220))+ (81744*220) + 39416;
System.out.println("result="+res);

Java が意味を決定するために使用する「ルール」は、+大まかに次のとおりです。

  • または右のオペランドの型が文字列の場合、+文字列連結を意味します。
  • 左オペランドと右オペランドの両方の型がプリミティブ数値型または数値ラッパー型である場合、+は数値加算を意味します。
  • それ以外の場合、これはコンパイル エラーです。

ここでのもう 1 つの問題は、が最大値 -2163788696より大きいことです。したがって、(オーバーフローなしで) 正しい答えを得るには、Java に算術演算を使用するように指示する必要があります。例えばint2147483647long

System.out.println("result=" + ((44334L * (220 * 220)) + (81744 * 220) + 39416));

そうしないresultと、負の数になります...この例では。

を使用することもできますBigIntegerが、少し面倒なので、longここでは問題なく機能します。

于 2012-12-30T22:01:40.143 に答える
1

バージョンについてはBigInteger、これを試してください。正しく動作します

BigInteger a = new BigInteger("44334").multiply(new BigInteger("220").multiply(new BigInteger("220")));
BigInteger b = new BigInteger("81744").multiply(new BigInteger("220"));
BigInteger c = new BigInteger("39416");
c = c.add(a).add(b);

System.out.println("resultVersA="+(44334*(220*220))+ (81744*220)  + 39416 );
System.out.println("resultVersB="+ c);

結果は次のようになります。

resultVersA=21457656001798368039416

resultVersB=2163788696
于 2012-12-30T22:09:31.837 に答える
0

あなたが書くすべての数字の後にLを入れてください.

(44334L*(220L*220L))+ (81744L*220L) + 39416L
于 2012-12-30T22:16:16.397 に答える