• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:円周の計算で妙な端数が出るのはなぜなのでしょう?)

円周の計算で妙な端数が出るのはなぜなのでしょう?

このQ&Aのポイント
  • 円周の計算で妙な端数が出るの原因や回避策について調べてみました。
  • Javaで円周を計算するプログラムを実行すると、半端な数字が出力されることがあります。
  • これはコンピュータの内部処理によるものであり、仕組みや回避策についても説明します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

double型は浮動小数点でして、これを二進数で表した場合、数字によっては厳密な表現が出来ないため、近似値となります。それが端数となってあらわれます。 参考URLもご参照下さい。

参考URL:
http://www.gimlay.org/~javafaq/S029.html
REEBO
質問者

お礼

遅くなりましたが、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.3

ちなみに、質問のバグを回避するには java.math.BigDecimalクラスを使えばいいでしょう。

REEBO
質問者

お礼

そのレベルまで至っていない者ばかりですので、 今は使う機会がないと思いますが、 今後の参考にしたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

javaに限らず、PCで扱う(整数以外の)実数は、 全て浮動小数で表現されています。 ですので、浮動小数について調べれば、 その答えもわかると思います。 参考サイトなどはご自分でお調べ下さい。

REEBO
質問者

お礼

いまは調べている時間が取れませんが、時間が出来たら調べようと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • java ファイル操作

    現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。

  • スタックトレースについて

    スタックトレースを出力して、例外をそのままスローする。 と、仕様の最後に書かれていたのですが、どうやればいいのかわかりません。 たとえば下記のソースだったらどう加えればいいのでしょうか? import java.io.*; class Test { public static void main(String args[]) throws IOException { System.out.println( args[0] + "の起動"); System.out.println("入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String PP; PP = br.readLine(); System.out.println( PP + "が入力されました"); } }

    • ベストアンサー
    • Java
  • Java問題 できればソースコードを教えて下さい。

    import java.io.*; public class K3 { /** * @param args */ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double[] data = new double[5]; System.out.println("5個の性のデータを入力して下さい"); int i = 0; do{ System.out.print("data{" + i + "}="); String str = br.readLine(); data[i] = Double.parseDouble(str); i++; }while(i<data.length && data[i-1] >=0); System.out.println("入力された結果を表示します"); i=0; while(i<data.length && data[i] >=0); System.out.println("data[" + i + "]: + data[i]"); i++; } } double型のデータを5個保存できる配列を準備し,do-while文を用いてデータの入力を行い,while文を用いて出力を行うプログラムを作成しなさい. ただし,入力するデータは正の数のみとし,入力が負の数だった場合は,データが5個より少なくても,入力・出力を停止することとしなさい.(whileの条件で判定し,if文等は設置しなくてよい.) そして,最後に,全データの合計値と平均値を出力しなさい お願いします

  • わからない

    今日はじめた者ですがどこが間違いかわかりません 教えてください import java.io.*; class p2 { public static void main(String args[]) throws IOException { System.out.println("正方形の一辺の長さをいれてください"); BufferedReader br = new BufferedReader(new InputStramReader(System.in)); String str = br.readLine(); double n = Double.parseDouble(str); System.out.println("その正方形の面積は" + nagasa * nagasa + "です"); System.out.println("その正方形が面の立方体の体積は" + n * n * n + "です"); } }

    • ベストアンサー
    • Java
  • コマンドプロンプトでひらがなの入力が出来ません。

    普段グーグル日本語入力を使っています。 OS XPsp2 import java.io.*; class Mojiretuate { public static void main(String[] args) throws IOException { String str = "こんにちは"; String str2; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列当てゲームです。"); System.out.println("答えは何かのあいさつです。"); for(;;){ System.out.println("\n入力"); str2 = br.readLine(); System.out.println("入力文字列の長さ:" + str2.length()); if(str.equals(str2)){ System.out.println("正解です"); break; } else if(str2.length() > str.length()){ System.out.println("長すぎます。"); } else if(str2.length() == str.length()){ System.out.println("長さはあっています。"); } else{ System.out.println("短すぎます。"); } } System.out.println("終了"); } }

    • ベストアンサー
    • Java
  • 【初心者です】javaで平均値を求めたいのですが...

    import java.io.*; public class ex31a { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader (System.in)); double sum = 0.0; while(true) { System.out.print("double> "); double x = (new Double(in.readLine())).doubleValue(); if(x == 0.0) { break; } sum = sum + x; } System.out.println("avarage = " + (sum % n)); } } 基本形はこのままで、最後の部分のSystem.out.printlnの部分を直したらいいんでしょうか。

    • ベストアンサー
    • Java
  • Scanner と BufferedReader

    javaでキーボードからの入力を格納するやつがあって、 Scanner と BufferedReaderのやり方がありますが、これはどう違うのでしょうか? それとも全く同じでしょうか? たとえば、 ■一つ目 import java.io.*; class Sample3{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列を入力してください"); String str1=br.readLine(); System.out.println("検索文字を入力してください"); String str2=br.readLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } ■二つ目 import java.util.Scanner; class Sample4{ public static void main(String[] args){ Scanner stdIn=new Scanner(System.in); System.out.println("文字列を入力してください"); String str1=stdIn.nextLine(); System.out.println("検索文字を入力してください"); String str2=stdIn.nextLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } これら2つは全く同じ実行結果が得られると思うのですが、 Scanner と BufferedReader の使い分けるべき場合などあるのでしょうか?

    • ベストアンサー
    • Java
  • キーボードから文字列を入力する際の質問です。

    キーボードから文字列を入力する際の質問です。 どうしてもカタカナでしか日本語の入力が出来ません。 ローマ字入力です。 import java.io.*; class Sample4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "が入力されました。"); } }

    • ベストアンサー
    • Java
  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • 下記のようなjavaのプログラムで、* や / を入力しても,

    下記のようなjavaのプログラムで、* や / を入力しても, 必ず判定がfalseのほうになるんですけど、どうすれば良いですか? あまりjavaには詳しくないので、分かりやすく教えていただければ幸いです。お願いします。 import java.io.*; public class test{ public static void main(String[] args) throws IOException{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String a; a = input.readLine(); if((a == "*") ^ (a == "/")){ System.out.println("OK"); }else{ System.out.println("エラー"); } } }

    • ベストアンサー
    • Java