• 締切済み

double型の減算がうまくいかない

Java初心者です。 今、Javaの勉強中で、double型の計算を行っています。 double型同士の減算を行った結果、思っていた結果と違う値が帰ってきたので、原因、もしくは解決方法をお教え頂ければと思います。 ソースは以下 public static void main(String[] args) { //値A double longitudeA = -73.98289; //値B double longitudeB = -73.98315; BigDecimal aDecimal = new BigDecimal(String.valueOf(longitudeA)); BigDecimal bDecimal = new BigDecimal(String.valueOf(longitudeB)); //減算 BigDecimal decimal = aDecimal.subtract(bDecimal); //小数点以下第5位で四捨五入し、出力 System.out.print(decimal.setScale(5, RoundingMode.HALF_UP).doubleValue()); } 出力される値として、 0.00026 を想定していたのですが、実際に出力されたのは 2.6E-4 でした。 BigDecimalのオブジェクトをそのまま出力すると想定通りの結果が出力されます。 一回Stringに型変換を行った後、Double#parseDoubleを行ったりしてみたのですが、 どうも思った通りの出力がされません。 解決策をお教え頂ければと思います。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • ete_01
  • ベストアンサー率100% (2/2)
回答No.2

System.out.print(decimal.setScale(5, RoundingMode.HALF_UP).toString());

回答No.1

何が御希望なのかよくわからないのですが、 指数表記がいやなのなら toPlainString() を 使ったらいかがでしょうか? BigDecimal#toString() がいつ指数表記を使うかは リファレンスに詳細な説明があります。 http://docs.oracle.com/javase/jp/1.5.0/api/java/math/BigDecimal.html#toString()

関連するQ&A

  • DoubleからBigDecimalへの変更の仕方

    以下のソースをdouble使用箇所をBigDecimalに変更して行いたいのですが・・・ public String test( String str1, String str2){ // 計算方法: // str1 / str2 の小数点第3位切り上げ後に100掛け // 割り算を行う double d = Double.valueOf(str1).doubleValue()/Double.valueOf(str2).doubleValue(); // 掛け算を行う d = d*100; // 小数点第1位切り上げる if (d >= 10.88) { d = 11; } DecimalFormat ff = new DecimalFormat("#0.0"); return ff.format(d); }

    • ベストアンサー
    • Java
  • 有効数字

    import java.lang.Math; public class NewtonMethod { public static void main(String args[]){ double x = 0.785; while (true){ double x2 = x * 2; double xN = x - (Math.cos(x2) - x2 + 1)/(- 2 * Math.sin(x2) - 2); if (xN >= x){ break; } x = xN; } System.out.println(x); } } このソースコードの求められたxを有効数字6桁で求めたいのですがどうすればいいのでしょうか? BigDecimal bi = new BigDecimal(String.valueOf(x)); x =bi.setScale(5,BigDecimal.ROUND_HALF_UP).doubleValue(); というのをどこかに入れればいいというところまではわかりましたが、さっきから実行してもうまくいきません; どなたか助けてください。よろしくお願いします。

  • double を すべて bigdecimal

    big decimalに直したいのですが・・・ doubleのところをbigdecimalに変えるだけじゃ動かないんですね。 当方、プログラムを勉強し始めて1か月の者です。 BigDecimal(double val)を使うのですか・・・? よろしくお願い致します。 class dentaku{ public static void main(String args[]){ double val1 = 0; /* 最初の数字 */ double val2 = 0; /* 次の数字 */ String ope; /* 演算子 */ double kekka; /* 結果を格納 */ if (args.length != 3){ errDisp("引数は3個入力して下さい"); } try{ val1 = Double.parseDouble(args[0]); val2 = Double.parseDouble(args[2]); }catch(NumberFormatException e){ errDisp("数値でない値が入力されています"); } ope = args[1]; String opeStr[] = {"kake", "waru", "tasu", "hiku"}; boolean errFlag = true; for (int i = 0 ; i < 4 ; i++){ if (ope.equals(opeStr[i])){ errFlag = false; } } if (errFlag == true){ errDisp("演算子は kake waru tasu hiku の4つです"); } if (ope.equals("kake")){ kekka = val1 * val2; }else if (ope.equals("tasu")){ kekka = val1 + val2; }else if (ope.equals("hiku")){ kekka = val1 - val2; }else{ if (val2 == 0){ errDisp("0 で割ろうとしました"); } kekka = val1 / val2; } System.out.println("入力された式は " + val1 + " " + ope + " " + val2 + " です"); System.out.println("計算結果は " + kekka + " です"); } private static void errDisp(String errStr){ System.out.println("Usage : java dentaku 数値 演算子 数値"); System.out.println(errStr); System.exit(0); /* プログラムを終了する */ } }

    • ベストアンサー
    • Java
  • このソースコードの意味が分かりません

    「次の演算を記載順に処理し、演算の結果を出力するプログラムを作成しなさい。ただし、出力は10^-7までとする。プログラムは複数のクラスを定義して作成すること。1-1/2+1/3-1/4+・・・・・+1/9999-1/10000」という問題です。 import java.math.BigDecimal; class Sample{ public static double a(){ double sum=0; for(int i=1;i<=10000; i++){ double div=(double)i; if(i%2==0){ div*=(-1); } sum+=1/div; } return sum; } } class Sample17{ public static void main(String args[]){ System.out.print(ensyu.a()+""); BigDecimal bi = new BigDecimal(String.value0f(ensyu.a())); double sum0 = bi.setScale(7.BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(+sum0); } } 学校の先生に何回も質問しにいってようやく実行できるソースコードは分かったのですが どういう処理をしているのかがよく理解できません。理解できないところを細かく書こうともした のですがそれさえも分からない状態です。 どうか皆様の力をお貸し下さい。よろしくお願いします。

  • Java 電卓を作っているのですが・・・

    こんにちは。 趣味でプログラミングをしているものです。 Java で電卓を再現しようとしていて、 コーディングが終わり動作を確認しているのですが、 わからないところがあるので質問させていただきました。 よろしくおねがいします。 平方根を求めるときなのですが、3や5などはある程度正確に求められている と思うのですが、 平方根を求めたとき整数になるもの 例えば9などは小数のまま表示されてしまいます。 電卓で表示され得るすべての実数について平方根を求めるには ニュートン法がよいと思うのですが・・・ 二点ほど質問させていただきます。 ------------------------------------ 質問A まず、BigDecimal型の平方根を求めて、 その toString() から得られた文字列を メソッドvalidControl( String value ) に渡すのですが その冒頭で末尾から先頭方向に続く'0' の列を取り除きたいのですが そのために、変数の中身をみてみたのがこの質問の下部のほうにある (ア) (イ) です。 sqrt(() などの演算結果でえられた文字列のうち 信頼できる範囲以下の文字列を validControl で切り取りたいのですが プロが実際に電卓を作るとしたら、 どのような処理になるのでしょうか? ------------------------------------ 質問B 平方根を求めるメソッドsqrt 内で二分法の処理では 除算のスケールを 64 に指定していますが、 実行結果(ア)(イ)の文字列の長さが異なるのは なぜでしょうか? ------------------------------------ private BigDecimal sqrt( BigDecimal value ) { BigDecimal two = new BigDecimal( "2" ); BigDecimal x = value.divide( two ); BigDecimal last_x = BigDecimal.ZERO; BigDecimal gap = x.subtract( last_x ); BigDecimal range = BigDecimal.ONE.movePointLeft( 64 ); BigDecimal t; while( gap.compareTo(range) > 0 ) { last_x = new BigDecimal( x.toString() ); //t = value.divide( x, 64, BigDecimal.ROUND_DOWN ); //(イ) //test statement t = value.divide( x, 64, RoundingMode.UP ); // (ア) // x = x.add( t ).divide( two ); gap = x.subtract( last_x ).abs(); } return x; } -------------------------------------- private String validControl( String value ) throws KETAException { String retstring = ""; boolean overflag = false; int idx1 = value.indexOf( '.' ); int gap = 0; int seisu_length = 0; // 整数部分の文字列の長さ int len = value.length(); int start = len-1; int idx2 = start; System.out.println( "(0)" + value ); System.out.println( "(1)" + String.valueOf( start ) ); while( value.charAt( idx2 ) == '0' ) { idx2 --; } if( idx2 != start ) { value = value.substring( 0, idx2 + 1 ); len = value.length(); } System.out.println( "(2)" +String.valueOf( idx2 ) ); // 以下省略 -------------------------------------- (ア) を実行したときの結果 (0) 3.000000000000000000000000000000000000 00000000000000000000000000000546875 (1)72 (2)72 --------------------------------------- (イ) を実行したときの結果 (0) 2.999999999999999999999999999999999999 999999999999999999999999999996875 (1)70 (2)70 -------------------------------------- 長文になり申しわけありませんが ご存知のかた教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • parseDouble文について

    以下のプログラムを作成しました。 import java.io.*; public class Class1 { public static void main (String args[]) throws IOException { System.out.println("円周率の値はいくつですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); double pi = Double.parseDouble(str); System.out.println("円周率の値は" + pi + "です。"); } } このようなプログラムをコンパイルすると、 「parseDoubleは、Doubleクラス内のメソッドではありません。」というエラーメッセージが出ます。parseDouble文がおかしいのだと思いますが、参考書で調べても一向に解決できません。解決方法をご存知の方は教えてください。  また、このparseDouble文は、参考書には出ているものの、MSDNライブラリには存在しませんでした。  そこのあたりの事情についても教えてください。  ちなみに開発環境はVisual J++6.0 Professional, OSはWindows XP Professionalです。

    • ベストアンサー
    • Java
  • BigDecimal小数計算について

    プログラミングに関する知識が皆無の初心者です。 「はじめてのandroidアプリプログラミング」という本に従って電卓のアプリを作っているのですが、小数点を含む計算ができず、困っております。 演算記号前の数字が小数で、演算記号後の数字が整数であるならば 1.5*2=3 と正しく計算ができますが、 演算記号後が小数点を含む数だと、計算されず演算記号後に入力した数字が 2*1.5=1.5 と、そのまま表示されてしまいます。 小数の表示は if (mOp == R.id.button_decimal || mCalcValue.scale() != 0) {  // 小数点を含む場合  BigDecimal bd = new BigDecimal(BigInteger.valueOf(value),mCalcValue.scale() + 1);  mCalcValue = mCalcValue.add(bd); } else {  // それ以外の場合  // 10倍  mCalcValue = mCalcValue.multiply(BigDecimal.TEN);  // 足す  mCalcValue = mCalcValue.add(new BigDecimal(value)); } で、 イコールを押したときの動作は public void onEqualClick(View view) {  switch (mOp) {   case R.id.button_plus:   // 足し算   mCalcValue = mPreValue.add(mCalcValue);   break;   case R.id.button_subtract:   // 引き算   mCalcValue = mPreValue.subtract(mCalcValue);   break;   case R.id.button_multiply:   // かけ算   mCalcValue = mPreValue.multiply(mCalcValue);   break;   case R.id.button_divide:   // 現在の値が0ではないかチェック   if (!BigDecimal.ZERO.equals(mCalcValue)) {    // 割り算    mCalcValue = mPreValue.divide(mCalcValue, 11,    BigDecimal.ROUND_HALF_UP);   }  break; } です。 どこのコードが原因かもわからず、どこを質問文に掲示すればアドバイスいただきやすいかもわからなかったため、質問文に不足あるかもしれません。 すみませんがよろしくお願いします。

    • ベストアンサー
    • Java
  • C# 巨大な文字列の計算をさせたい

    お世話になります。 C#にて、文字列からなる計算式 string s = "(3270+(5*4))/7"; のようなものを計算して 値を返す処理を作成したいと思っています。 http://dobon.net/vb/dotnet/programing/eval.html ↑上記のサイト様から、DataTable.Computeで 求める方法を参考にしたのですが、戻り値を decimalで受けたいのですが、decimalで取得することができません。 doubleでは取得できますが、decimalでcastしようと すると、InvalidCastExceptionが発生します。 string exp = "(1+6)*5/(7-4)"; //式を計算する System.Data.DataTable dt = new System.Data.DataTable(); decimal result = (decimal)dt.Compute(exp, "");        ↑この行で発生 要は、intやdoubleでは収まらない巨大な桁を持つ文字列の 計算をさせたいのですが、どうすればよいでしょうか。 よろしくお願いいたします。

  • 少数50桁以上を表示するには

    小数点以下の第50位を計算結果として表示させたいのですが、うまくいきません。 今は BigDecimal BD = new BigDecimal("0.000・・・・"); double d; ----計算---- BD = new BigDecimal(d); ----表示---- として、表示させているのですが47桁くらいで終わってしまいます。 どうしたらいいのでしょうか。 情報が曖昧すぎますが、わかる方教えてください。

    • ベストアンサー
    • Java
  • java 電卓 平方根

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが質問させていただきます。 Java で文具店で1000円くらいで売っているような電卓を再現 しようとしているのですが 平方根のボタンを押したときの処理でつまづいています。 3 を入力して平方根のボタンを押すと以下のサイトに表示されている限りにおいては 同じ数値になります。 http://ja.wikipedia.org/wiki/3%E3%81%AE%E5%B9%B3%E6%96%B9%E6%A0%B9 ここで質問の内容について説明させていただきます。 Windows に標準で付属している電卓では 0.5 を入力して平方根のボタンを押し続けると 最後には 1 が表示されます。 ですが、以下に示す自分のコードだと 0.99999999998 と表示されてその後 平方根のボタンを押し続けても同じ結果になります。 0.99999999998 で収束しているのだと思いますが、 (自分の作った電卓では小数点以外の数字は12個表示されるようになっています。) 1 に収束するようにするには、 以下に示す メソッドsqrt 内の計算部分の 割り算のスケールの指定とかを変えれば うまくいくのでしょうか? ----------------------------------------------- 平方根のボタンを押したときの処理です。 case CalculatorEvent.TYPE_SQRT : if( negativeflag ) { if( ! display.showBigMinus ) showNumString = showNumString.substring( 1 ); } result = sqrt( new BigDecimal( showNumString ) ); //test statement System.out.println( "from 1446 : " + result.toString() ); result = result.setScale( 32, RoundingMode.HALF_UP ); showNumString = result.toString(); //test statement; System.out.println( "sqrt result : " + showNumString ); // . . . . //以下おもに端数を表示桁数に丸めて、 //負の値の平方根を求めたときは //絶対値の平方根を求めて表示 // エラーであるマークも表示 // 呼び出し元に例外を投げる // 呼び出した側で例外を受け取ると // 電卓のボタンを入力できないようにする ----------------------------------------------- 上記コード test statement は以下の出力結果になると 以後 平方根のボタンを押しても同じ結果が出力されます。 from 1446 : 0.9999999999899999999999499999999994999999999937499999999125000000078125 sqrt result : 0.99999999998999999999995000000000 ------------------------------------------------ 上記コード中のメソッド sqrt です。 private BigDecimal sqrt( BigDecimal value ) { BigDecimal two = new BigDecimal( "2" ); BigDecimal x = value.divide( two ); BigDecimal last_x = BigDecimal.ZERO; BigDecimal gap = x.subtract( last_x ); BigDecimal range = BigDecimal.ONE.movePointLeft( 64 ); BigDecimal t; while( gap.compareTo(range) > 0 ) { last_x = new BigDecimal( x.toString() ); //t = value.divide( x, 64, BigDecimal.ROUND_DOWN ); //test statement t = value.divide( x, 64, RoundingMode.HALF_EVEN ); // x = x.add( t ).divide( two ); gap = x.subtract( last_x ).abs(); } return x; } ----------------------------------------------- 長文になりもうしわけありませんが、 ごぞんじのかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java