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

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

新規登録して質問してみよう
ただいま回答率
85.32%
Eclipse Plugin

Eclipseは、IBMによって開発された統合開発環境 (IDE) の一つです。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応しています。Eclipse-Pluginを使う事でIDEの拡張を行う事が可能です。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

322閲覧

Java Servlet 表記、大小比較

meguuuu

総合スコア7

Eclipse Plugin

Eclipseは、IBMによって開発された統合開発環境 (IDE) の一つです。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応しています。Eclipse-Pluginを使う事でIDEの拡張を行う事が可能です。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2025/03/02 05:55

編集2025/03/02 07:50

実現したいこと

確率5%のくじをn回(変数charange)ひきr回(変数win)当たるときの確立を求めるprobilityAtlesst→probility
を実行した後のanswerをJspに出力するようにするとき、

①jspに出力する際、%表示を小数点第二位までの表記にしたい

②doPostメソッド内でリクエストパラメータを受け取った値を大小比較してif文の中に組み込みたい

if(){}

else if(win>charange)
(入力された文字が大きすぎます)
~

発生している問題・分からないこと

①jspに出力する際、MathemaクラスのgetAnswerメソッドで

return String.format("%.2f", this.answer);

としたがjspでは小数点二位で正しく入力されない(デバッグで検証済み)

②       math.setWin(Integer.parseInt(win));
math.setCharange(Integer.parseInt(charange));

おそらくmathインスタンスのフィールドにwinの値が入っているのでdoPostメソッド内でcomparewin、comparecharangeの変数に入れても入らないとはわかるがmath.win(charange)とやっても参照できない

該当のソースコード

package Model; public class Mathema { private int per, nper; private int win,charange; double answer; public int getCharange() { return charange; } public void setCharange(int charange) { this.charange = charange; } public int getWin() { return win; } public void setWin(int win) { this.win = win; } public int getPer() { return per; } public void setPer(int per) { this.per = per; } public double getNPer() { return nper; } public void setNPer(int nper) { this.nper = nper; } public void setAnswer(double answer) { this.answer=answer; } public String getAnswer() { return String.format("%.2f", this.answer); } }
package Servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import Model.Mathema; import Model.ProbilityLogic; @WebServlet("/ProbilityCheck") public class ProbilityCheck extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheck.jsp"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Mathema math = new Mathema(); String charange = request.getParameter("charange"); String win = request.getParameter("win"); math.setWin(Integer.parseInt(win)); math.setCharange(Integer.parseInt(charange)); if (charange != "" && win != "") { ProbilityLogic probilityLogic = new ProbilityLogic(); //probilityLogic.execute(math);以前 probilityLogic.probilityAtLeast(math); request.setAttribute("math", math); RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheckResult.jsp"); dispatcher.forward(request, response); } else if (comparewin > comparecharange) { request.setAttribute("errorMsg", "数字が大きすぎます"); RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheck.jsp"); //Beansのインスタンス(loginUser)が入ってると、main画面(main.jsp)に飛ぶ dispatcher.forward(request, response); } else { //エラーメッセージをリクエストスコープに保存 request.setAttribute("errorMsg", "数値が入力されていません"); RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheck.jsp"); //Beansのインスタンス(loginUser)が入ってると、main画面(main.jsp)に飛ぶ dispatcher.forward(request, response); } } }
package Model; public class ProbilityLogic { public double probility(int n ,int r) { double ans = 1; double answer; for (int i = n; i > n - r; --i) { ans = ans * i;//分子階乗 } for (int i = 1; i < r + 1; ++i) { ans = ans / i;//分母階乗 } double result = Math.pow(0.05, r); double result2 = Math.pow(0.95, n - r); answer = 100 * (result2 * result * ans); return answer; } public void probilityAtLeast(Mathema math) { double totalprobility = 0; int r = math.getWin(); int n = math.getCharange(); for (int k = r; k <= n; k++) { totalprobility += probility(n, k);//rではない } //System.out.println("計算結果: " + totalprobility); math.setAnswer(totalprobility); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <% String errorMsg = (String) request.getAttribute("errorMsg"); %> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>サイトへようこそ</h1> <h1>計算</h1> <form action="ProbilityCheck" method="post"> <input type="text" name="charange">(回試行して)<br> <input type="text" name="win">(回当たる)<br> <input type="submit" value="送信"> </form> <% if (errorMsg != null) { %> <p><%=errorMsg%></p> <% } %> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="Model.Mathema"%> <% Mathema math = (Mathema) request.getAttribute("math"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <p> <%= math.getAnswer() %>% (デバッグ: <%= math.getAnswer() %>) <%=math.getCharange()%>回試行して<br> <%=math.getWin()%>回以上当たる確率は<br> <%=math.getAnswer()%>%です<br> </p> </body> </html>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

①double型変数answerを、String.format("%.2f", this.answer);
としてstringに変え、小数点第二位までの表示にしようとしていますが、実際のJSPファイルの表示
(
<%= math.getAnswer() %>% (デバッグ: <%= math.getAnswer() %>)
)
には変わらず小数点が二位以上の値が表示されてしまっています

②リクエストパラメータの値を直接if文の中に組み込みelse if(win>charange)とすると、Stringクラスでは"<"演算子は定義されていないといった注釈が付けられています

math.setWin(Integer.parseInt(win));
math.setCharange(Integer.parseInt(charange));

にある通りこれをint型に変換しようとして、この値をif文の中で使おうと思ったのですが上手くいきません(Mathemaクラスのsetメソッドに行っているため?)

補足

Mathemaクラスの
per,nperは現在はまだ使用してないです

<環境>

eclipse

Version: 2024-12 (4.34.0)
Build id: 20241128-0757

java version "23.0.2" 2025-01-21
Java(TM) SE Runtime Environment (build 23.0.2+7-58)
Java HotSpot(TM) 64-Bit Server VM (build 23.0.2+7-58, mixed mode, sharing)

TomCat9
Java17

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

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

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

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

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

maisumakun

2025/03/02 07:17

> jspでは小数点二位で正しく入力されない(デバッグで検証済み) この部分は入力コードではなく出力なのですが、何を検証してどうなった状況でしょうか?
meguuuu

2025/03/02 07:30

すみません出力です <%= math.getAnswer() %>% (デバッグ: <%= math.getAnswer() %>) の所がデバッグのために出力した部分です
meguuuu

2025/03/02 07:41

試した事、調べた事に詳細を追加しました
jimbe

2025/03/02 09:03 編集

ProbilityCheck サーブレットは、ご提示のコードで実行しようとしているのでしょうか。 comparewin と comparecharange の宣言や代入が無ければコンパイルエラーになるように見えるのですが。 ついでに、 >String charange = request.getParameter("charange"); >String win = request.getParameter("win"); > >math.setWin(Integer.parseInt(win)); >math.setCharange(Integer.parseInt(charange)); > >if (charange != "" && win != "") { という流れでは、charange や win が "" だった時 if に辿り着く前に Integer.parseInt で例外が発生するのではないでしょうか。 (さらには、文字列の比較に == を使う場合はご注意ください。)
meguuuu

2025/03/02 09:07

はい、そうです
meguuuu

2025/03/02 10:38

cmparechanceとcomdparewinはなんとか代入したけどできなかった残りです この2つになんとかリクエストパラメータから持ってきた値を入れたいのですが...
jimbe

2025/03/02 11:36

”コンパイルも通らないコード” で ”動作時の問題” をデバックすることは出来ません。 複数の問題を同時進行で解決しようとするのではなく、1つずつ確実に(動作を理解しながら)解決したほうが結果的に早い場合も多いです。 あっちとこっちを変更したらあっちは正しく直せたけどもこっちの所為で違うバグを入れてしまったなんてことも良くあることです。
meguuuu

2025/03/02 13:24

成る程です...一応空文字を入れた場合は最後のelse文で動いてるのは確認済みです(jspにも表示) perseIntの例外とはそれ以外の例外という事でしょうか?
jimbe

2025/03/02 14:35

Integer.parseInt("") は NumberFormatException が発生します。 doPost() がご提示の通りであれば、 win="" の時 > math.setWin(Integer.parseInt(win)); で例外が発生して if まで行かないはずです。 それが通っているというなら今提示されているコードとそちらお手元で動作しているコードは違うということであり、今提示されているコードを調べてもそちらのお手元の問題の原因かどうか分からないということになります。
meguuuu

2025/03/02 15:39

いろいろと確認していたのですがもともとdoPostメソッド内は protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String charange = request.getParameter("charange"); String win = request.getParameter("win"); if (charange != "" && win != "") { Mathema math = new Mathema(); math.setWin(Double.parseDouble(win)); math.setCharange(Double.parseDouble(charange)); ProbilityLogic probilityLogic = new ProbilityLogic(); probilityLogic.probilityAtLeast(math); request.setAttribute("math", math); RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheckResult.jsp"); dispatcher.forward(request, response); } else { //エラーメッセージをリクエストスコープに保存 request.setAttribute("errorMsg", "数値が入力されていません"); RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/ProbilityCheck.jsp"); dispatcher.forward(request, response); } } となっていました、perseInt(もともとはDoubleですが)をif文の外に出して何とかwinとcharangeの値を抜き出したかったのです そうだとするとこの時の処理が残って実行されているということなのでしょうか、前に調べたときにTomCat内のキャッシュによって以前使われていたデータが使われる現象があるとは見ました 一応、Result.jsp内のデバッグ分を消去しましたら標示にも出なくなりましたので全く別のプロジェクトというわけではないと思います
meguuuu

2025/03/02 15:43

×デバッグ分 ○デバッグ文 ProbilityCheckResultの <%= math.getAnswer() %>% (デバッグ: <%= math.getAnswer() %>) のところです
jimbe

2025/03/03 11:57

元々の doPost で文字列→数値変換が「charange と win が空で無かったら」の if の中にあったのなら、 charange や win が空でも例外が発生せずに else に行くのは納得です。 というかその状態で動いていたのになぜ文字列→数値変換を if の外に出す必要があるのでしょうか。 math オブジェクトに win と charange がセットされれば、 win と charange はそれぞれ getWin() / getCharange() メソッドで値が取れるのですから、 math.setWin(Double.parseDouble(win)); math.setCharange(Double.parseDouble(charange)); if(math.getWin() > math.getCharange()) { //"値が大きい" エラーを設定 } else { ProbilityLogic probilityLogic = new ProbilityLogic(); //正常処理(以下略) } のように if の入れ子にすれば良いように思うのですが。 >そうだとするとこの時の処理が残って実行されているということなのでしょうか、前に調べたときにTomCat内のキャッシュによって以前使われていたデータが使われる現象があるとは見ました 一番面倒なのが「動くけども時々変」という状況で、それが開発環境に内在するという何ともやり切れない状況なのは確かです。 doPost があるのはサーブレットで jsp とは Tomcat 内において扱いが違いますので jsp が反映されたからといってサーブレットも最新とは言えないのではないでしょうか。
guest

回答1

0

自己解決

相変わらずエクリプスの挙動がおかしく四苦八苦していましたがどうやら自動ビルドの設定がオフになっていたらしくこれをオンにすると上手くコードが反映され小数表記も正しくなりました
Integer.perseIntはif文の外だと例外が発生するのでcatchして記入する事により上手く動作出来ています
コメントくださった方本当にありがとうございました

投稿2025/03/04 11:06

meguuuu

総合スコア7

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

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

jimbe

2025/03/05 03:25

>自動ビルドの設定がオフになっていたらしくこれをオンにすると上手くコードが反映され その設定をすっかり忘れていました。指摘出来ず申し訳ないです。 お疲れさまでした。
meguuuu

2025/03/05 04:52

本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問