【初心者】Java質問・相談スレッド93【大歓迎】
昨日からJava始めたばかりですが、いきなり分からない事が出てきました。
//Exercise1.java
class Exercise1{
public static void main(String args[]){
float a;
a=2.0;
System.out.println("変数aの値は"+a+"です");
}
}
これでコンパイルすると、エラーが出ます。
検出値:double
期待値:float
となります。
doubleで宣言してやるとうまく行きましたが、どうしてfloatで宣言できないのでしょうか?
>>964 2.0という値の型がdoubleだから。
2.0f と書くとfloatの定数になる。
>>965 すいません。理解できません。
本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
それ以外にも違いがあるということでしょうか?
>>966 double から float への変換は、精度が悪くなる変換なので
キャストしないとコンパイル時に怒られる。
float から float なら問題ないけど。
968 :
ぴゅあ:2006/11/20(月) 16:22:55
なんだろ?
>>963 >当り前な事でも
誰が当たり前と決めたのか知らないけど
どんな些細なことでも実際にやってみることが大切だと思いますけどね
>>967 せっかく答えて頂いたのに、私の理解力が追いついていません。
とりあえず、入門書を一通り読んでから、また来ます。
ありがとうございました。
>>966 2.0 と書いただけだと double になるのよ。だから内部的には2進数で
0100000000000000000000000000000000000000000000000000000000000000
として保持される。64ビットを使って表現してるわけですよ。さてここで
あえて float だと指定してすると(※ 2.0f と書く(
>>965を参照))今度は
01000000000000000000000000000000
というように32ビットの表現になるわけですよ。扱える桁数が違うとか、
数値の精度が違うというのは、こういうことです。
>>964>>966>>969は、わかりましたか?
971 :
970:2006/11/20(月) 17:20:42
>>969 float と double の違いは、扱える桁数にある
⇒ 桁数が多いほうから少ないほうへ不用意に変換すると、値が変わってしまうことがある
⇒ もしプログラマ側が意図していない変換だとバグの元になる (実際この手のバグでロケットが墜落している)
⇒ コンパイラが親切にも警告を出してくれる
OK?
みなさん。
ちょっと解かったかもしれません。
つまり、
>>964でコンパイル出来るということは、32ビットで作業しているから。
本の作者は32ビットの環境でコンパイルしていたって事でしょうか?
Java のバージョンの問題?
OSの違い?
精度や桁数がどうとかいう問題の前に、
ある型の変数に異なる型の値は入れられない、
というのを理解しているんだろーか。
javaのバージョン (かな? コンパイラでバージョンアップと共にワーニングが厳しくなるのはよくある事)
もしくは本のバグ
>>973 32bit の環境でコンパイルしたとか、OS が違うとかは考えにくい
java もしくは javac のバージョンが違うというのは、まあよくあること
最も多いのは、本の誤植もしくはバグ
>>974 それは大丈夫だと思います。
int に 2.0 は入れられないということですよね。
int a;
a=2;
としなければいけないのは解かります。
2.0 は double で、2.0f とすれば float ということですね。
本のバージョンは 1.4.1_01 で
私のバージョンは 1.5.0_09 でした。
Java のバージョン違いが原因?
とにかく、2.0 だと double になるというのが解かったので、本の float を double に置き換えながら、読み進めたいと思います。
>>979 世界でいちばん簡単な
Java の e 本
Java の基本と考え方がわかる本
2003年6月1日 第1版第1刷発行
著者 堀江 幸生
発行 株式会社秀和システム
ISBN4-7980-0533-9 C3055
です。
>>980 うーん、改訂入ってるんじゃないかな・・・