Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

桁数の制限

ある問題で
ユーロ=円÷1ユーロあたりの円136.5
という式で計算すると
100円で0.73260073...といっぱい桁が出ます。
この桁を小数点第2位まで制限する、といったことはどうすればできるのでしょうか?

その方法として
「セント未満を切り捨てるには、ユーロの計算で100を掛けてから整数化し、さらにこれを100で割って実数化する。」
と書いてあるのですが、よく意味がわからなくてできませんでした。

27

回答

5610

閲覧

27件の回答

評価

0

DecimalFormat ()を使ってみてはいかがでしょうか?

使用方法は、Javaの道-Java基本-数データ-フォーマットに記載してあります

評価

0

表示するだけならSystem.out.printfを使う、って手もあります。J2SE5.0以上なら、ですけど。

評価

0

import java.io.*;
import java.text.*;

public class R2
{
    public static void main(String args[]) throws IOException
    {
        BufferedReader abc =
        new BufferedReader(new InputStreamReader(System.in));
        
        String u;
        int en;
        double U,uro;
        
        System.out.println("1ユーロあたりの円");
        u = abc.readLine();
        U = Double.parseDouble(u);
        
        System.out.println("ユーロの換算");
        System.out.println("円            ユーロ");
        
        for (en=100 ; en<=3000 ;en=en+100)
        {
            uro = en/U;
              double exValue1 = uro;
              DecimalFormat exFormat1 = new DecimalFormat("0.##"); //(1)
            
            System.out.println(en+"            "+exFormat1.format(exValue1));
        }
        
        u = abc.readLine();
    }
}

このようにやってみて、できました。ありがとうございました。
あとできれば、
>「セント未満を切り捨てるには、ユーロの計算で100を掛けてから整数化し、さらにこれを100で割って実数化する。」
これの意味を誰か教えてくださると助かります。

評価

0

「セント未満を切り捨てるには、ユーロの計算で100を掛けてから整数化し、さらにこれを100で割って実数化する。」

1.100をかける
2.せいすうにする
3.100でわる
4.じっすうにする

ということだとおもいます。

評価

0

http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2006-19,GGLG:ja&q=java+%e4%b8%b8%e3%82%81

評価

0

Uやらuroやら・・・
正しくはeuroですよ。abcも意味不明だし、コーディングのスタイルもMSのC言語的。
一体何を参考にするとこうなってしまうのか、謎です・・・

評価

0

        {
            uro = (en/U)*100;
            yuro = (int)uro;
            uro = (double)yuro/100;
            
            
            System.out.println(en+"            "+uro);
        }

for文をこのように直しても完成できました。
整数化や実数化というのは(int)(double)のことだったようです。

>     
Uやらuroやら・・・
正しくはeuroですよ。abcも意味不明だし、コーディングのスタイルもMSのC言語的。
>一体何を参考にするとこうなってしまうのか、謎です・・・
別にeuroという正しいスペルを用いなくても、abcという適当な文字でも、プログラム的に問題はないはずですよ。人それぞれです。
コーディングのスタイルといわれても、初心者の練習なのですから。
それともC言語的だと何か問題があるのでしょうか。

評価

0

>プログラム的に問題はないはず
ロジック的には問題がありませんが、プログラム的には問題がないとはいえません。

>それともC言語的だと何か問題があるのでしょうか
「MSの」C言語的です。これも問題があります。通常Javaで書かない方法でプログラムを記述すると、プログラムの見通しが悪くなります。Javaには標準的な規約があるのですから、特に意味が無いのなら出来る限りそれに従ったほうが無難です。

>人それぞれです
人それぞれでは困る状況もあるのです。
将来プログラマになりたいのでしたら、まわりにあわせることの大切さも学ぶべきです。

評価

0

コードを元に解説をお願いしているのに、
人に読んでもらうということが理解できていないのだろうね。
で、開き直りか。

評価

0

プログラム的に問題があるのですか。どういった風に問題があるのかよろしければ教えてください。

上のプログラムでは標準的な規約にしたがってないのでしょうか。大体は本の通りに打ち込んでいるのすが・・・(本のタイトルはJava標準テキスト)

プログラマになるかどうかはわかりませんが、まわりに合わせるときがきたら、そうするつもりですので。今は練習中ですから。


開き直りに見られてしまったのなら残念ですが、そのようなつもりではないです。
私はJavaが初めてなので、わからないから質問をさせていただきました。
ただそれだけで他意はありません。

評価

0

プログラムは、もちろん動作が正確なことが大前提ですが、分かりやすく書くということが大切です。
ソースをぱっと見て、その変数が何を意味しているのかが分かるように、考えましょう。

評価

0

入力された文字が数値かのチェック方法

1.正規表現で数値以外のものが混在するかチェック
2.char型配列に変換して すべてが範囲内にあるかどうか
3.catch句で 数値変換例外を取得する

javaの ver. によりFormatter系 クラスが使えない場合
浮動少数点数値には.がひとつしかないことを利用し
数値を文字列化し.を検索し検出されればその数値に2を加算し文字化浮動小数点数値からsubstringなどで切り出すのがいいでしょう。

評価

0

import java.io.*;

public class R2 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader
            = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("1ユーロあたりの円");
        double yenPerEuro = Double.parseDouble(reader.readLine());
        
        System.out.println("ユーロの換算");
        System.out.println("      円   ユーロ");
        
        for (int i = 0; i < 30; i++) {
            int yen = 100 * (i + 1);
            double euro = yen / yenPerEuro;
            System.out.printf("%8d %8.2f%n", yen, euro);
        }
        
        reader.readLine();
    }
}

ロジックはたいして変わりませんが、どちらのプログラムのほうが見通しがいいでしょうか?
プログラム的に問題があるとは、こういうことです。

また、人間、慣れというものは怖いもので、日頃からの習慣はそうそうなおるものではありません。
練習中だから、とたかをくくっていると、いずれ後悔することになると思いますよ。

>セント未満を切り捨てるには、ユーロの計算で100を掛けてから整数化し、さらにこれを100で割って実数化する。
100というのは10の2乗ですよね。
10の2乗をかけるということは、桁を2つずらすことを意味します。
で、それを整数型の変数に格納すると、小数点以下は切り捨てられます。このとき、元の数の小数点第3位以下が切り捨てられ、小数点第2位は桁をずらしたことにより、残ります。

12.3456

|100倍

1234.56

|整数化

1234

これを100で割って元に戻すと、

1234

|1/100

12.34

となり、小数点以下2桁が保持されることになります。
ここで一つ注意しなければならないのは、プログラム上で

double ans = 1234 / 100;

としても、12.34にならないことです。そこで、

double ans = 1234 / 100.;

などとして回避します。

評価

0

懇切丁寧な説明をありがとうございました。
分かりやすさなどにも気を配ってプログラミングの練習を続けていきたいと思います。

あと適当さんのプログラムをコンパイルしてみたら
System.out.printf("%8d %8.2f%n", yen, euro);
この場所でエラーがでてしまいました。
どうすればなおるのでしょうか。

評価

0

エラーが出たときは、最低でもどんなエラーが起きたかを書かなければ、なかなか原因は絞れません。
何となくとかの推測でしか言えなくなってしまいますので、今後はエラー内容を添えてください。

その何となくの推測でお答えすると、お使いのJavaのバージョンはいくつでしょうか?
printfは5.0からの機能ですので、それ以前のJavaですとコンパイルが出来ないと思われます。

評価

0

上の私の発言よくよんで フォーマッターが使えない場合のきり方のひとつがのってる。

評価

0

バージョンは6.0です。
エラーはこうです。
R222.java:18: シンボルを解決できません。
シンボル: メソッド printf (java.lang.String,int,double)
場所    : java.io.PrintStream の クラス
            System.out.printf("%8d %8.2f%n", yen, euro);
(R2は既に同じ名前のファイルがあったので、R222に直しました)

評価

0

>バージョンは6.0です。
たぶんインストールしただけで、パスを変更しておらず、以前のバージョンが使われているのでしょう。

評価

0

それと、「yenPerEuro」は「ratio」くらいでいいかも知れませんね。

評価

0

パスも設定して、コマンドプロンプトでjava -versionで打ち込んで確かめ、java version"1.6.0-oem"と出ました。verと打ち込んだらMicrosoft Windows [Version 6.0.6000]とでました。
これでもエラーがでます。これではだめなのでしょうか・・・

評価

0

それは実行コマンドで、コンパイルコマンドではありません。

評価

0

javac -version
でどうなります?

評価

0

javac -versionとコマンドプロンプトに打ち込んでみましたが、

javac: -version は無効なフラグです。
使い方: javac <option> <source file>
使用可能なオプションには次のものがあります。
・・・
・・・

という文が出てきました。オプションの中には-versionというものはありませんでした。
似たようなもので-verboseというのはありましたが。
(一応、javac -verbose R222.java とも打ち込んでみましたが、普通にコンパイルした時と同じエラーがでました。)

コンパイルコマンドというのも検索してみましたが、よくわからなかったです・・・

評価

0

J2SE5.0以前では-versionオプションはありません。ということで、最新版のパスが通っていませんね。

評価

0

むぅ、紛らわしいか・・・
J2SE5.0には-versionオプションがあったはずで、1.4は確実にありませんでした。
System.out.printfが使えるのは5.0からですので、お使いのjavacではコンパイルできないことになります。

評価

0

1.Pathを通してない
2.Pathを通したが古いverのJavac を呼び出している

1.の場合は設定してください。
2.の場合は設定から古いほうを削除してください。

Pathの頭からよぶので末尾につけると古いverのほうがよびだされます。

評価

0

3. JRE6だけインストールしてある。

3. JDK6をインストールしてください。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。