2011-02-23 6 views
4

ProcessingからJavaへいくつかのコードを移植しています。問題の1つは、処理のプリコンパイラがdoubleをfloatに変換することです。しかし、Eclipseでは明示的に値をfloatとしてキャストしなければなりませんでした。それでも、私は理解していない間違いを受けます。たとえば、このステートメントの末尾にfを置くと、タイプの不一致が修正されます(タイプの不一致:doubleを floatに変換できません)。Javaでfloatにキャストする方法がわかりません

このような簡単なステートメントでも、タイプの不一致が発生します。私は間違って何をしていますか?

float theta = .01f; 
+0

実際には浮動小数点数を使用する必要がありますか、またはプログラムをダブルメモリで使用することができますか?これは簡単かもしれません:-) –

+0

私はまだダブルスとフロートの違いについては不明です。これを説明するページはありますか? – Miles

+0

floatは32ビットの単精度浮動小数点値、倍精度は64ビット倍精度です。http://en.wikipedia.org/wiki/Floating_pointを参照してください。 – Jesper

答えて

9

さて、2番目の文は、Javaの標準で正しいですが、あなたの最初の例では、Javaはおそらく明示的にプログラマがするように求められなければならない精度の損失に浮かぶためにダブルスを変換することを防ぐためにしようとしています、よう:

double a = //some double; 
float b = (float) a; //b will lose some of a's precision 
+0

Er ... is that is(float ) '意図的なのか、それともタイプミスですか? – Mehrdad

+0

タイプミス、私は誤って2つを混在させました。 – donnyton

1

Javaの文法をよると、fサフィックスは、floatリテラルにのみ適用されます。 2番目のステートメントは機能するはずです。 fサフィックスは全体ではなく、式の後、リテラルに直接のみ有効で、

springing[n] = (float)(.05*(.17*(n+1))); 
1

あなたの最初の例では:最初は、しかし表現であるため、キャストが必要です。そうそれらのいずれかの方法でそれを書く(仮定跳躍がfloat []である):

springing[n] = .05f*(.17f*(n+1)); 
springing[n] = (float)(.05*(.17*(n+1))); 

最初に(離れn+1部分から)フロート全体計算はない、もう一つは二重、次いで変換で算出します結果だけを浮動させる。

(乗算が連想されるので、どちらの場合も、.05.17(と一致するもの)との間に括弧が、通常は不必要である。それはnの本当に大きな値のためにいくつかの違いを行う可能性がありますが、これらの例では、あなたが普通だろう他の方法でオーバーフローを避けたい場合)

関連する問題