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

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

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

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

Q&A

解決済

3回答

962閲覧

int型をdouble型に変更する方法

gamestart

総合スコア6

Java

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

0グッド

0クリップ

投稿2019/11/23 14:05

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
javascriptしているんですが、
javaでintに数字を入れるそれを計算したいんですが
その数字を入れた結果を小数点にしたいんですがわからなくって。教えてください。初心者なのでお手柔らかにお願いします

int num1 = 0;
int num2 = 0;
double resultNum;

try { num1 = Integer.parseInt(request.getParameter("num1")); num2 = Integer.parseInt(request.getParameter("num2")); resultNum = num2/(num1*num1);←これだとできない。。 } catch (NumberFormatException e) { resultNum = 0; } request.setAttribute("num1", num1); request.setAttribute("num2", num2); request.setAttribute("resultNum", resultNum);

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

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

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

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

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

guest

回答3

0

ベストアンサー

最初からdoubleで受け取るのは駄目なのでしょうか。

Java

1double num1 = 0; 2double num2 = 0; 3double resultNum; 4 5try { 6 num1 = Double.parseDouble(request.getParameter("num1")); 7 num2 = Double.parseDouble(request.getParameter("num2")); 8 resultNum = num2/(num1*num1); 9} catch (NumberFormatException e) { 10 resultNum = 0; 11} 12request.setAttribute("num1", (int)num1); 13request.setAttribute("num2", (int)num2); 14request.setAttribute("resultNum", resultNum);

キャストするなら、最短はおそらくこれです。

Java

1resultNum = 1. * num2 / (num1*num1);

万人にとって読み易いとは到底言い切れないので、積極的に推奨はしません。

投稿2019/11/24 06:59

LouiS0616

総合スコア35660

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

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

dameo

2019/11/24 07:08

オーバーフローの件があるので、その書き方なら↓な方が好きです resultNum = num2 / (1. * num1*num1);
LouiS0616

2019/11/24 07:17 編集

コメントありがとうございます。 オーバーフローの心配をするのであれば、longで受け取るか、自乗にMath.powを使えば良いと思います。 キャストの順序に意味を持たせるのは意図が通じづらいですし、かといって全ての値をdoubleにキャストするのも冗長です。
gamestart

2019/11/25 05:08

jspに送った時0.0と表示されるのですが、なんででしょうか。
LouiS0616

2019/11/25 10:43

setAttributeの際、intにキャストしましたか?
gamestart

2019/11/25 14:38

仕方がわかりません
LouiS0616

2019/11/25 15:09

キャストについて調べ、ある程度理解しましたか。 まずそれが分からないとどの回答も理解が難しいように思います。
guest

0

resultNum = num2/(num1*num1);←これだとできない。。

多分、結果は、小数点以下無しでしょうか?

resultNum = (double)num2/(double)(num1*num1);

とキャストしてあげてください。(片方でも良かったか?)
int同士の計算は、intで行われ(小数点以下無し)、その後、doubleに変換されます。

投稿2019/11/23 14:12

編集2019/11/24 01:58
pepperleaf

総合スコア6383

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

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

m.ts10806

2019/11/23 22:42

doublw になってますよ
pepperleaf

2019/11/24 01:59

訂正。手元に環境が無いので、間違えた。
ironya

2019/11/24 03:02

> (片方でも良かったか?) この式の場合片方で良いですね。というか、どれかひとつ変数をキャストすれば、どの変数でもこの式の場合は同じ結果になります。 が、あまり脈略の読み取れない位置でキャストするのはどうかと思いますけど。(例えば、分母の最後の num1 だけキャストする)
pepperleaf

2019/11/24 03:20

不要なキャストは止めろ、との指摘もありますね。 手元ですぐに確認できなかったので、両方にしてしまった。
dameo

2019/11/24 03:56

@pepperleafさん 個人的には、面倒なら全部キャストの方がいいくらいです。非常に細かくて実用的には気にしなくていいレベルですが、 num1*num1 は両方intなので、オーバーフローが起きえます。こういうのを防ぎたいなら一律 resultNum = (double)num2/((double)num1*(double)num1); とキャストしちゃった方が分かりやすいと思います(longで計算してdoubleとかも可)。 一番短く書くなら、 resultNum = num2/((double)num1*num1); こんな感じですが、全ての人が規則に詳しいわけではないので、誤解の少ない全キャストの方が個人的には好きですよ。 最後にオーバーフローのサンプルだけ載せておきます。 class Sample { public static void main(String[] args) { int x = Integer.MAX_VALUE; System.out.println((long)(x * x)); System.out.println((long)x * x); } } 実行結果 1 4611686014132420609
pepperleaf

2019/11/24 04:04

> 面倒なら全部キャストの方がいいくらいです。 実行速度の問題とかでは無く、無意味なキャストを止めましょうです。 型の違いが検出されず、実はエラーなのに、キャストでエラーにならず、バグの要因となる場合があるからです。(Javaでは、まだ縁は無いが、Cでは結構、泣かされた)
dameo

2019/11/24 04:24

プリミティブの型拡張とオブジェクトのアップ/ダウンキャストを混同するのはどうかと思いますが、まあそうですね。いずれにしても個人的な意見を伝えただけなので、お気になさらず。
guest

0

int を double にするとのことですが、 double などの primitive 型の浮動小数点数は十進数の小数表現が不正確な場合があります。それで問題ないでしょうか。

問題ないのなら、pepperleaf さんが書かれたように計算式中で int 型の変数に対して double へのキャストいう方法で良いです。具体例は pepperleaf さんが示されているのでそちらをご参照ください。

不都合な場合は、 double ではなくて java.math.BigDecimal の使用を考えた方が良いです。
小数点以下の必要桁数と丸め方法(四捨五入とか切り捨てとか)を指定する必要はありますが以下のように求められます。

次は小数点以下2桁に四捨五入する例です。

java

1BigDecimal resultNum = BigDecimal.valueOf(num2).divide( 2 BigDecimal.valueOf(num1).pow(2), 2, BigDecimal.ROUND_HALF_UP); 3System.out.println(resultNum.toPlainString());

int num1=3; int num2=7; の場合の実行結果

0.78

計算結果は 0.7777・・・の循環小数なので、小数第3位を四捨五入させた値になりました。
ここで、もし小数点以下の桁数を指定しないと、無限の桁数が必要になってしまって BigDecimal の divide メソッドは ArithmeticException をスローするので注意してください。

BigDecimal.valueOf(num2).divide(BigDecimal.valueOf(num1).pow(2)) の場合のエラー

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.base/java.math.BigDecimal.divide(BigDecimal.java:1722) at Main.main(Main.java:22)

ご質問にあるコードの場合、上の System.out.println の引数に指定したように toPlainString の結果をsetAttributeすれば良いでしょう。

java

1request.setAttribute("resultNum", resultNum.toPlainString());

JavaSE 8 の BigDecimal の javadoc
BigDecimalの使い方 も参考になると思います。

投稿2019/11/24 03:22

編集2019/11/24 03:28
ironya

総合スコア454

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問