• 締切済み

有効数字

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(); というのをどこかに入れればいいというところまではわかりましたが、さっきから実行してもうまくいきません; どなたか助けてください。よろしくお願いします。

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

みんなの回答

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

どう上手くいかないのでしょうか? 具体的におっしゃってください。 ちなみにそのコードを差し込んでも 「有効数字6桁」 は作れません。 あくまで 「小数点以下6位で四捨五入」 しているに過ぎません。

関連するQ&A

  • このソースコードの意味

    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); } } これのdouble xN = x - (Math.cos(x2) - x2 + 1)/(- 2 * Math.sin(x2) - 2);の部分がよくわかりません。 どなたか教えてください。よろしくお願いします。

    • ベストアンサー
    • 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); } } 学校の先生に何回も質問しにいってようやく実行できるソースコードは分かったのですが どういう処理をしているのかがよく理解できません。理解できないところを細かく書こうともした のですがそれさえも分からない状態です。 どうか皆様の力をお貸し下さい。よろしくお願いします。

  • 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を行ったりしてみたのですが、 どうも思った通りの出力がされません。 解決策をお教え頂ければと思います。 よろしくお願いします。

  • 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
  • 複数の数字を計算

    下記のプログラムだと、 1 tasu 1 tasu 1 tasu 1 tasu 1 をしても答えは2となります。 入力された数字を一気に計算できる方法を教えて下さい。 また、必ず5の値を入力しなくては、いけないのでは無くて、5つ以下ならOKにしたいです。 コマンドプロンプト上で自ら入力し動くプログラムを作成中です。 例: 1 tasu 1 tasu 1 tasu 1 tasu 1  答え5      1 tasu 1 tasu 1 答え3 /*演算子チェックと演算実行*/ if (args[1].equals("tasu")){ /*演算子チェック*/ ans1 = num1 + num2; }else if (args[1].equals("hiku")){ /*演算子チェック*/ ans1 = num1 - num2; /* hiku 演算実行*/ }else if (args[1].equals("kake")){ /*演算子チェック*/ ans1 = num1 * num2; /* kake 演算実行*/ }else if (args[1].equals("waru")){ /*演算子チェック*/ if(num2 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num1); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num2); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子1: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[3].equals("tasu")){ /*演算子チェック*/ ans1 = num2 + num3; }else if (args[3].equals("hiku")){ /*演算子チェック*/ ans1 = num2 - num3; /* hiku 演算実行*/ }else if (args[3].equals("kake")){ /*演算子チェック*/ ans1 = num2 * num3; /* kake 演算実行*/ }else if (args[3].equals("waru")){ /*演算子チェック*/ if(num3 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num2); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num3); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子2: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[5].equals("tasu")){ /*演算子チェック*/ ans1 = num3 + num4; }else if (args[5].equals("hiku")){ /*演算子チェック*/ ans1 = num3 - num4; /* hiku 演算実行*/ }else if (args[5].equals("kake")){ /*演算子チェック*/ ans1 = num3 * num4; /* kake 演算実行*/ }else if (args[5].equals("waru")){ /*演算子チェック*/ if(num4 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num3); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num4); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子3: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[7].equals("tasu")){ /*演算子チェック*/ ans1 = num4 + num5; }else if (args[7].equals("hiku")){ /*演算子チェック*/ ans1 = num4 - num5; /* hiku 演算実行*/ }else if (args[7].equals("kake")){ /*演算子チェック*/ ans1 = num4 * num5; /* kake 演算実行*/ }else if (args[7].equals("waru")){ /*演算子チェック*/ if(num5 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num4); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num5); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子4: kake waru tasu hiku の中から入力して下さい"); }

    • ベストアンサー
    • Java
  • 【初心者です】javaで平均値を求めたいのですが...

    import java.io.*; public class ex31a { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader (System.in)); double sum = 0.0; while(true) { System.out.print("double> "); double x = (new Double(in.readLine())).doubleValue(); if(x == 0.0) { break; } sum = sum + x; } System.out.println("avarage = " + (sum % n)); } } 基本形はこのままで、最後の部分のSystem.out.printlnの部分を直したらいいんでしょうか。

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

    現在JAVAについて学んでいるのですが、下記のソースが実行出来ません。どなたかわかる方、回答宜しくお願いいたします。 public class Lound { void main(String[] args) { String rtn = methWithParamReturn(3); if(rtn.equals("0")) System.out.println("0あかんよ"); else System.out.println(rtn); } public String methWithParamReturn(int x) { System.out.println(x); x= x*x; String str = String.valueOf(x); return str; } }

  • 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
  • Jasminを使用して10桁のフィボナッチ数列を表すには・・・??

    初投稿です、よろしくお願いします。 プログラミング初心者で、まだ右も左もよく分からないヒヨッコですが、 この間学校でjasminコードというものを習い始め、まだちゃんと理解していないうちに、こんな問題を出されました。 ================================ 以下のコードをjasminで表しなさい。 public class exam2 { public static void main(String args[]) { dofib(9); } public static void dofib(int n) { int n1 = 0; int n2 = 1; int tmp; if ((n < 0) || (n == 0)) System.out.println("0"); for (int i = 0; i < n; i++) { System.out.println(n1 + " "); tmp = n2; n2 = n1 + n2; n1 = tmp; } } } フィボナッチ数列を10桁まで表示するコードです。 ================================ 私と友達が作ってみたjasminコードはこちらです。 .class public examples/Fibo .super java/lang/Object ; ; standard initializer .method public <init>()V aload_0 invokenonvirtual java/lang/Object/<init>()V return .end method .method public static main([Ljava/lang/String;)V .limit locals 5 .limit stack 10 getstatic java/lang/System/out Ljava/io/PrintStream; astore_1 bipush 10 istore_2 iconst_0 dup ;invokevirtual java/io/PrintStream/println(I)V; ;invokestatic java/lang/String/valueOf(C)Ljava/lang/String; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V istore_3 bipush 1 istore 4 L0: iload 3 dup iload 4 dup ;invokestatic java/lang/String/valueOf(C)Ljava/lang/String; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V iadd iload 4 istore 3 istore 4 iload_2 ifeq L1 iinc 2 -1 goto L0 L1: return .end method しかし、これではうまく動作しませんでした。 何か解決方法や提案など、ございましたら教えていただけたら幸いです。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 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

専門家に質問してみよう