質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3637閲覧

四捨五入のプログラムでエラーが出て困っています

Sharnon_Ishey

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/10/09 04:28

編集2017/10/09 05:25

###前提・実現したいこと
javaで四捨五入のプログラムを作っています。キーボードから四捨五入する値を入力して、四捨五入する位を入力すると結果が表示され、’n’を入力すると終了し、Enterやその他のキーが入力されると四捨五入する位を再びたずねて、値を入力すると四捨五入してくれるプログラムを作っています。

###発生している問題・エラーメッセージ

1回目は正常に作動し、'n'を入力すると終了しますが、Enterや他のキーを入力すると 四捨五入する位を再びたずねて何も入力できないままエラーメッセージが表示されます。 以下が実行例です。(”nを入力すると終了します”のあとはEnterを入力した) C:\Users\●●●●●\プログラミング>java RoundUp 四捨五入したい数を入力してください 36781.72 どの位を四捨五入しますか? 例)10000, .., 10, 1, 0.1, .., 0.0001 0.1 四捨五入した結果 36782.0 nを入力すると終了します どの位を四捨五入しますか? 例)10000, .., 10, 1, 0.1, .., 0.0001 Exception in thread "main" java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at sun.misc.FloatingDecimal.parseDouble(Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at RoundUp.main(RoundUp.java:22)

###該当のソースコード

import java.io.*; class RoundUp { public static void main (String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("四捨五入したい数を入力してください"); String str = br.readLine(); int repeat = 0; do{ // 変数初期化(2回目以降) double x = Double.parseDouble(str); double p = 0; // 四捨五入する位の入力と入力判定 do{    System.out.println("どの位を四捨五入しますか?");    System.out.println("例)10000, .., 10, 1, 0.1, .., 0.0001");    String str2 = br.readLine();    double o = Double.parseDouble(str2);    double n = 0.0001;    for(int i = 0; i < 9; i++){    if(o == n && o > 0){    p = o;    break;    }    n = n*10;    }    if(p == 0){    System.out.println("例にならって入力してください");    } }while(p == 0); // 正負による四捨五入の処理の場合分け int s = 1; if(x < 0) s = -1; // 四捨五入の処理 x = (x + 5*p*s)/(10*p); int y = (int)x; double z = y*(10*p); // 結果表示    System.out.println("四捨五入した結果");    System.out.println(z); // nを入力で終了 Enterや他のキーが入力されると四捨五入する位を再指定させ再実行するようにしたい System.out.println("nを入力すると終了します"); repeat = br.read(); }while(repeat != 'n'); } }

###試したこと
System.out.println("nを入力すると終了します");
repeat = br.read();
の2行を消しEnterを入力すると再び四捨五入する位をたずねて、値を入力すると四捨五入してくれるがもう終了したくても終了できない。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/10/09 04:54

ブロックごとにインデントを下げてください。
guest

回答2

0

ベストアンサー

該当のコードでは、2回目以降の入力に限らず、最初の入力時にEnterのみを入力しても同様の例外が発生するのではないかと思われます。

発生箇所は、スタックトレースにも記載がありますが、下記のparseDoubleに数値として変換できない文字列が入力されるために発生しています。

String str2 = br.readLine(); double o = Double.parseDouble(str2);

これを回避するためには、以下の2点の修正が必要です。
0. repeatで1文字取得している箇所を、1行の文字列として取得するようにする。
0. parseDoubleで変換に失敗した場合の処理を追加する。

修正例としては下記のようになります。
このコードでは、最初のString str = br.readLine();でも数値に変換できない値が入力された場合、同じようにNumberFormatException例外が発生しますので、対応方法を考えてみられるとよいかと思います。

java

1import java.io.*; 2class RoundUp 3{ 4 public static void main (String[] args) throws IOException 5 { 6 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 7 8 System.out.println("四捨五入したい数を入力してください"); 9 String str = br.readLine(); 10 11 String repeat = ""; 12 do{ 13 // 変数初期化(2回目以降) 14 double x = Double.parseDouble(str); 15 double p = 0; 16 17 // 四捨五入する位の入力と入力判定 18 do{ 19 try { 20 System.out.println("どの位を四捨五入しますか?"); 21 System.out.println("例)10000, .., 10, 1, 0.1, .., 0.0001"); 22 String str2 = br.readLine(); 23 double o = Double.parseDouble(str2); 24 double n = 0.0001; 25 for(int i = 0; i < 9; i++){ 26 if(o == n && o > 0){ 27 p = o; 28 break; 29 } 30 n = n*10; 31 } 32 if(p == 0){ 33 System.out.println("例にならって入力してください"); 34 } 35 } catch (NumberFormatException e) { 36 System.out.println("数値以外が入力されました"); 37 p = 0; 38 } 39 }while(p == 0); 40 41 // 正負による四捨五入の処理の場合分け 42 int s = 1; 43 if(x < 0) s = -1; 44 45 // 四捨五入の処理 46 x = (x + 5*p*s)/(10*p); 47 int y = (int)x; 48 double z = y*(10*p); 49 50 // 結果表示 51 System.out.println("四捨五入した結果"); 52 System.out.println(z); 53 54 // nを入力で終了 Enterや他のキーが入力されると四捨五入する位を再指定させ再実行するようにしたい 55 System.out.println("nを入力すると終了します"); 56 repeat = br.readLine(); 57 }while(repeat != "n"); 58 } 59}

投稿2017/10/09 05:02

編集2017/10/09 05:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sharnon_Ishey

2017/10/09 05:19

回答ありがとうございます! 上記の修正例で実行してみたところ以下のようにエラーメッセージがでました。 RoundUp2.java:56: エラー: 不適合な型: Stringをintに変換できません: repeat = br.readLine(); ^ RoundUp2.java:57: エラー: 型intとStringは比較できません }while(repeat != "n"); そこでrepeatをint型からString型にしてみたところ上手くいきました。ありがとうございます!
退会済みユーザー

退会済みユーザー

2017/10/09 09:35 編集

結果的には想定の動作となったようでなによりです。 ご指摘の部分はこっそり直しておきました。 実行していないのがばれてしまいましたね。
swordone

2017/10/09 09:37

repeat != "n"なんて、永遠に成立してしまう無限ループなのでは
退会済みユーザー

退会済みユーザー

2017/10/09 09:38

guest

0

何も入力せずEnterを押した場合、入力には改行文字CR(U+000D)が1文字のみ入っている状態になります。
この状態でrepeat = br.read();が実行された場合、repeatには13が入ります。
これで次のループのString str2 = br.readLine()が実行されると、もう残っている入力がないため、str2は空文字になります。これをparseDoubleしようとしたためエラーになります。

余談ですが、doubleで丸めを行うのは不向きなので、BigDecimalを使ったほうがいいです。

投稿2017/10/09 10:41

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問