電子書籍の厳選無料作品が豊富!

佐藤と申します。
いつも拝見させて頂き、参考にさせて頂いております。

小数点について質問させて頂きます。
単価と数量、割引率を入力とし、収益率と合計金額を算出しようと思っております。
合計金額はごく普通の計算式で問題ありませんでしたが、収益率を小数点第2位(以降切捨て)で算出出来ておりません。

自分なりに色々と調べ、BigDecimalを使えば小数点を表示する事が出来るとの事ですが、計算式では使用することが出来ませんでした。
計算結果を小数点以下で表示することは可能でしょうか?
分かる方がいらっしゃれば、是非ご教授下さい。
宜しくお願い致します。


import java.io.*; //入力ストリームクラスのインポート定義
import java.math.BigDecimal;
public class kadai12{
public static void main(String args[]) throws IOException{

//キーボードからの入力等
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

//入力データバッファの定義&代入

String check;
char w0;
int w1=0;
int w2=0;
int w3=0;
int num;

//System.out.print("1");


//読込チェック=NULLならば処理を終了させる
while(((check = buf.readLine())!=null)){
char[] src = check.toCharArray();
String[] work = check.split(",");
int a=0;

//入力ファイルチェック1
try{
num=Integer.parseInt(work[1]);
}catch(Exception e){
System.out.print("2桁目が数値ではありません");
return;
}
//入力ファイルチェック2
try{
num=Integer.parseInt(work[2]);
}catch(Exception e){
System.out.print("3桁目が数値ではありません");
return;
}
//入力ファイルチェック3
try{
num=Integer.parseInt(work[3]);
}catch(Exception e){
System.out.print("4桁目が数値ではありません");
return;
}

//w0=名称 w1=単価 w2=数量 w3=割引率
w0=src[0];
w1=Integer.parseInt(work[1]);
w2=Integer.parseInt(work[2]);
w3=Integer.parseInt(work[3]);

//合計金額算出
n=0;
n=w1*w2;

//収益率算出
BigDecimal n2=new BigDecimal("0.00");
n2=n*w3/n;
System.out.println(check);
System.out.println(n2 + "=" + n + "*" + w3 + "/" + n);
System.out.println(n + "=" + w1 + "*" + w2);
}
}
}

A 回答 (2件)

質問の意図と違うかもしれないですが、


2つの数値を割って小数第二位まで表示、それ以降を切り捨てする方法です。
ExcelやAccessなどでよく使われる考え方です。

double dividend = 9; //割られる数
double divisor = 7; //割る数
double d = dividend / divisor; // 9/7 = 1.2857…
double d2 = (d * 100);  //1.2857…*100 = 128.57…
int i = (int)d2;  // (int)128.57… → 128
double ans = i / 100.00; // 128 / 100.00 = 1.28

doubleをintにキャストすると、小数部分が切り捨てられます。
これを利用すれば、切捨ては簡単に可能です。
ただ、今回は小数第二位までは残さないといけないので、最初に100倍しておきます。
これにより、小数第二位までが整数に桁上げされます。
その後でintへキャストし、小数部分(元は小数第三位以下)を切り捨てます。
後は、100.00で割って桁上げを元に戻します。

計算部分をまとめると、
double dividend, divisor;
double ans = (int)(dividend / divisor * 100) / 100.00;
という風に書けます。

こんな感じです。
あまり細かい検証はしていないので、違ってたらすみません。
あと、このやり方は負の数が入ると厳密には正しくなくなります。
(もう一つ、二つくらい工夫が必要です)
金額計算ということで、正の数を限定したやり方です。
    • good
    • 0
この回答へのお礼

neko_nokoさん、ご回答をありがとうございます。
私の求めていた答えが正にそれです。
neko_nokoさんに記述して頂いた通りにPGMを作り変えたら上手く行きました。

丁寧なご回答、誠に感謝致します。
ありがとうございました。

お礼日時:2007/07/23 22:56

mod という演算子があるのを御存じでしょうか? これを使えば簡単に少数以下を計算できます。

整数部は普通にA/Bで計算できます。少数部は(A mod B)*100/Bで少数二桁が得られますから、これをフォーマット出力すれば少数部分が出て来ますね。
    • good
    • 0
この回答へのお礼

なるほど。modという演算子は初めて耳にしました。
意外と簡単にコーディング出来てしまいそうですね。
今からmodを使ってプログラムを作ってみようと思います。

とても勉強になりました。
本当にありがとうございます。

お礼日時:2007/07/23 22:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!