【初心者】Java質問・相談スレッド93【大歓迎】

このエントリーをはてなブックマークに追加
964デフォルトの名無しさん
昨日から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で宣言できないのでしょうか?
965デフォルトの名無しさん:2006/11/20(月) 15:51:02
>>964
2.0という値の型がdoubleだから。
2.0f と書くとfloatの定数になる。
966デフォルトの名無しさん:2006/11/20(月) 16:14:15
>>965
すいません。理解できません。
本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
それ以外にも違いがあるということでしょうか?
967デフォルトの名無しさん:2006/11/20(月) 16:16:33
>>966
double から float への変換は、精度が悪くなる変換なので
キャストしないとコンパイル時に怒られる。

float から float なら問題ないけど。
968ぴゅあ:2006/11/20(月) 16:22:55
なんだろ?

>>963
>当り前な事でも
誰が当たり前と決めたのか知らないけど
どんな些細なことでも実際にやってみることが大切だと思いますけどね
969デフォルトの名無しさん:2006/11/20(月) 16:33:58
>>967
せっかく答えて頂いたのに、私の理解力が追いついていません。
とりあえず、入門書を一通り読んでから、また来ます。
ありがとうございました。
970デフォルトの名無しさん:2006/11/20(月) 17:16:30
>>966
2.0 と書いただけだと double になるのよ。だから内部的には2進数で
   0100000000000000000000000000000000000000000000000000000000000000
として保持される。64ビットを使って表現してるわけですよ。さてここで
あえて float だと指定してすると(※ 2.0f と書く(>>965を参照))今度は
   01000000000000000000000000000000
というように32ビットの表現になるわけですよ。扱える桁数が違うとか、
数値の精度が違うというのは、こういうことです。
>>964>>966>>969は、わかりましたか?
971970:2006/11/20(月) 17:20:42
あと、詳しいことは http://ja.wikipedia.org/wiki/IEEE754 でも見て勉強してくれ。
972デフォルトの名無しさん:2006/11/20(月) 17:33:26
>>969
float と double の違いは、扱える桁数にある
⇒ 桁数が多いほうから少ないほうへ不用意に変換すると、値が変わってしまうことがある
⇒ もしプログラマ側が意図していない変換だとバグの元になる (実際この手のバグでロケットが墜落している)
⇒ コンパイラが親切にも警告を出してくれる

OK?
973デフォルトの名無しさん:2006/11/20(月) 17:43:29
みなさん。
ちょっと解かったかもしれません。
つまり、
>>964でコンパイル出来るということは、32ビットで作業しているから。
本の作者は32ビットの環境でコンパイルしていたって事でしょうか?
Java のバージョンの問題?
OSの違い?
974デフォルトの名無しさん:2006/11/20(月) 17:43:50
精度や桁数がどうとかいう問題の前に、
ある型の変数に異なる型の値は入れられない、
というのを理解しているんだろーか。
975デフォルトの名無しさん:2006/11/20(月) 17:45:32
javaのバージョン (かな? コンパイラでバージョンアップと共にワーニングが厳しくなるのはよくある事)
もしくは本のバグ
976デフォルトの名無しさん:2006/11/20(月) 17:50:32
>>973
32bit の環境でコンパイルしたとか、OS が違うとかは考えにくい
java もしくは javac のバージョンが違うというのは、まあよくあること

最も多いのは、本の誤植もしくはバグ
977デフォルトの名無しさん:2006/11/20(月) 17:55:31
>>974
それは大丈夫だと思います。
int に 2.0 は入れられないということですよね。
int a;
a=2;
としなければいけないのは解かります。
2.0 は double で、2.0f とすれば float ということですね。
978デフォルトの名無しさん:2006/11/20(月) 18:07:54
本のバージョンは 1.4.1_01 で
私のバージョンは 1.5.0_09 でした。
Java のバージョン違いが原因?
とにかく、2.0 だと double になるというのが解かったので、本の float を double に置き換えながら、読み進めたいと思います。
979デフォルトの名無しさん:2006/11/20(月) 18:09:25
>>978
その本の名前を書いてちょ
980デフォルトの名無しさん:2006/11/20(月) 18:18:48
>>979
世界でいちばん簡単な
Java の e 本
Java の基本と考え方がわかる本

2003年6月1日 第1版第1刷発行

著者 堀江 幸生

発行 株式会社秀和システム

ISBN4-7980-0533-9 C3055

です。
981デフォルトの名無しさん:2006/11/20(月) 18:21:29
>>980
うーん、改訂入ってるんじゃないかな・・・
982デフォルトの名無しさん:2006/11/20(月) 18:30:01
質問です。

ttp://java.sun.com/applets/jdk/1.4/index.html

このページのGraphLayout (1, 2, 3, 4)のデモアプレットのソースが全部同じなんですけど
これのソースってどこかにないでしょうか?
983デフォルトの名無しさん:2006/11/20(月) 18:43:30
>>982
よく見ろよ
984ぴゅあ:2006/11/20(月) 18:57:38
>>978
>とりあえず、入門書を一通り読んでから、また来ます。
と言ってたからそれでいっか と思ってたけど、>>965,>>967で十分なものが出ているんじゃないかと思いました
(>float から float なら問題ないけど。
は"float aからfloat bへの代入…"とかいう表現の方がいいのかな?と思ったりはしたけど)

>>966では
>本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
ということだけど、"扱える桁数にある"というところもよく理解できていないような気もしたりします

解らなければ仕方ないのだろうけど
変に考え込み過ぎているんじゃないだろうか?という気もしたりです
コンパイラがエラーだと言っているんだから
解らないと思ううちは解らないなりに素直に従えばいいような気がしますけど
(いちおでも>>965,>>967の言ってることを把握できていれば)

また>>964に示されたコードはその本に書かれていたものなのでしょうか
あちしが選んで最初に買った唯一のJavaの書籍はかなり古いですが、>>965,>>967が言ってることはちゃんと解説されています(JDK 1.0.2頃に書かれたものらしい)
因みに最近主に使っているのは1.4.2_12で1.4.1よりは新しいけど、確認してみるとちゃんとエラーとして通知されるようです

>>964
>これでコンパイルすると、エラーが出ます。
>検出値:double
>期待値:float
>となります。
と書かれているところから
"Exercise1.java:8: 精度が落ちている可能性"とか出ているだろうところを
落としてしまっているところにも理解に至れない問題があったりするのかも?
985デフォルトの名無しさん:2006/11/20(月) 23:00:42
>>984
>>964のコードは、本に書かれていた通りのものです。
float と double の違いについては殆ど触れられておらず、悩んだ挙句にここへ質問に来たわけです。
さっき、書店によって、他の本を見てきたところ、
「 float a=1.0f; 」と、数値の後に f をつける必要があるので注意と、ちゃんと書かれていました。
どうも、私の買った本に誤植があったということみたいです。

いろいろ教えてもらって、本当にありがとうございます。
こんなに親切なスレは初めてです。