2012-08-26 23 views
6

私はこの数式はJavaでどのように機能しますか?

int test = 5 + 3 * (4 - 1)/2; 

ような何かをするとき、私はintは切り捨てているため、これはだった疑いが9を得ます。しかし、私はこの

float test = 5 + 3 * (4 - 1)/2; 

を行うとき、私はまた、私はこの

float test1 = 5; 
float test2 = 4.5; 
float test = test1 + test2; 

テストが最終的に9.5を出力しないとき、しかし9を取得します。誰かがこの背後にある論理を説明できますか?私は2番目の例で9.5を得ないのはなぜですか?ありがとう。 2番目の例で

+0

整数除算はJavaだけでなく多くの言語でこのように行われます。 C、C++、C#、Java、JavaScriptのすべてのC言語がこのように動作します。 – duffymo

答えて

16

、あなたがタイプfloatの変数に結果を割り当てているが、計算自体はまだ正確に実施例1と同じ方法で行われます。 Javaは、右辺を計算する方法を決定するために、宛先変数の型を調べません。特に、部分式3 * (4 - 1)/24になります。この問題を解決するには

、あなたの代わりにすべての整数の浮動小数点リテラルを使用することができます:算術式のための浮動小数点演算2.0fトリガーを使用して

float test = 5 + 3 * (4 - 1)/2.0f; 

を。

+0

それは理にかなっていますが、それを追跡するのはちょっとした苦痛になるようです。ありがとうございました。 – glcohen

+0

@ user1626448:たいていの場合、既に浮動小数点型や二重型の型を持っている既存の変数を1つ以上使って計算を行います。その場合、これについて心配する必要はありません。 –

3

あなたはフロートで5 + 3 * (4 - 1)/2の結果を表しているが、実際の評価は、それらがフロートとして評価した場合9/2戻り4よりもむしろ4.5の分割は、あなたが受信することを意味し、整数の精度で行われます。

2

式には、それぞれ独自のタイプがあります。だから始める:

5 + 3 * (4 - 1)/2 

各値にはそれぞれ固有のタイプがあります。このタイプは、intであることを起こるので、これは同じです:我々はint型を扱っているということが明確に作る

((int)5) + ((int)3) * (((int)4) - ((int)1))/((int)2) 

。この後でのみ、9と評価されます。これはフロートに割り当てられます。

0

簡単な答えは、整数型はモジュラス1で動作し、残りは破棄するということです。

testを整数としてキャストするので、モジュラス1(例:9.5 mod 1)、 intテスト= 5 + 3 *(4-1)/ 2でモジュラ演算が使用されます。

32または64ビットの浮動小数点数の場合、9.5になります。ただし、testintとしてキャストしたため、残りは破棄され、testで参照される値は9です。

関連する問題