• 締切済み

小数点以下の切捨てにつきまして

佐藤と申します。 いつも拝見させて頂き、参考にさせて頂いております。 小数点について質問させて頂きます。 単価と数量、割引率を入力とし、収益率と合計金額を算出しようと思っております。 合計金額はごく普通の計算式で問題ありませんでしたが、収益率を小数点第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); } } }

みんなの回答

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.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; という風に書けます。 こんな感じです。 あまり細かい検証はしていないので、違ってたらすみません。 あと、このやり方は負の数が入ると厳密には正しくなくなります。 (もう一つ、二つくらい工夫が必要です) 金額計算ということで、正の数を限定したやり方です。

satohdesu
質問者

お礼

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

  • Willyt
  • ベストアンサー率25% (2858/11131)
回答No.1

mod という演算子があるのを御存じでしょうか? これを使えば簡単に少数以下を計算できます。整数部は普通にA/Bで計算できます。少数部は(A mod B)*100/Bで少数二桁が得られますから、これをフォーマット出力すれば少数部分が出て来ますね。

satohdesu
質問者

お礼

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

関連するQ&A