- ベストアンサー
少数50桁以上を表示するには
BLUEPIXYの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
サンプルを作ってみました。 公式そのままなので、難しいところはないと思います。 (課題ということなので、丸写しするのではなくて、こんな感じでBigDecimalの計算をやるんだなぐらいに思って貰って、円周率を求める公式というのは、他にもいろいろあるので、そういうものやプログラムを検索して、自分でも作ってみてください。ていうか、多分削除されてしまうと思うしね。(削除されるにしても、何をどうしていいかわからん感じなので、書いてみました、このプログラムでは、収束ということを調べないで、これぐらいのループをすれば充分という感じでやってます。変更するなら、収束したかどうかでループを終了するようにしたらいいかと思います。その場合、無限ループに陥らないように、最初は、回数で制限を付けた方がいいかと思います。)) -------------------------------------------------------------------- import java.math.BigDecimal; import java.math.RoundingMode; //π/4=tan-1(1)=1-1/3+1/5-1/7+…は、収束が遅すぎる /* ガウス・ルジャンドルの公式 1.初期値 a = 1 b = 1 / sqrt( 2 ) t = 1 / 4 x = 1 2.a と b が求めようとする精度以上に十分等しくなるまで下の式を反復 y = a a = ( a + b ) / 2 b = sqrt( b ・ y ) t = t - x ・ ( y - a )^2 x = 2 ・ x 3.収束した a , b および t の値を用いて、πの値は、 π = ( a + b )^2 / ( 4 ・ t ) */ public final class Pai { static BigDecimal pai; static int scale; static { Pai.pai = Pai.pai(100);//最初に100桁分求める } private Pai(){}; static public BigDecimal sqrt(BigDecimal a, int scale){ /* sqrt(a)=x=(x^2+a)/2x */ scale*=2;//2倍精度 a=a.setScale(scale, RoundingMode.HALF_EVEN); BigDecimal x = a.divide(new BigDecimal(2), RoundingMode.HALF_EVEN); int c=(int)Math.round(Math.log(scale)/Math.log(2)); for(int i=0;i<c;i++) x=x.pow(2).add(a).divide(x.add(x),scale,RoundingMode.HALF_EVEN); return x.setScale(scale/2, RoundingMode.HALF_EVEN);//精度を戻す } static public BigDecimal pai(int scale){ if(Pai.scale==scale){ return Pai.pai; } if(Pai.scale > scale){ //要求桁数が保持してる桁数より小さい時は、単に桁数を変換して返す return pai.setScale(scale, RoundingMode.HALF_EVEN); } //要求される桁数が保持している桁数より大きいので、更新する Pai.scale=scale; scale*=2;//内部的に2倍の精度で計算する BigDecimal one = BigDecimal.ONE; BigDecimal two = new BigDecimal(2); one=one.setScale(scale); two=two.setScale(scale); BigDecimal a = one; BigDecimal b = one.divide(Pai.sqrt(two, scale), RoundingMode.HALF_EVEN); BigDecimal t = one.divide(new BigDecimal(4), RoundingMode.HALF_EVEN); BigDecimal x = one; BigDecimal y; int c=(int)Math.round(Math.log(scale)/Math.log(2)); for(int i=0;i<=c;i++){ y = a; a = a.add(b).divide(two, RoundingMode.HALF_EVEN); b = Pai.sqrt(b.multiply(y), scale); t = t.subtract(x.multiply(y.subtract(a).pow(2))); x = x.add(x); } Pai.pai=a.add(b).pow(2).divide(t.multiply(new BigDecimal(4)),scale,RoundingMode.HALF_EVEN); Pai.pai=pai.setScale(Pai.scale, RoundingMode.HALF_EVEN); return Pai.pai; } public static void main(String ar[]){ BigDecimal sqrt5 = Pai.sqrt(new BigDecimal(5),50); System.out.println(sqrt5); System.out.println(sqrt5.multiply(sqrt5)); System.out.println(Pai.pai(100)); System.out.println(Pai.pai(50)); } }
関連するQ&A
- エクセルで小数点以下3桁を四捨五入して、小数点以下1桁を表示する方法
エクセル2003を使用しています。 計算式から出た結果に対して、小数点以下3桁を四捨五入して、小数点以下2桁ではなく、1桁を表示したいです。 例えば、計算式の結果、 1.145 の場合、普通に四捨五入すると 小数点以下1桁なら、1.1 小数点以下2桁なら、1.15 となってしまいます。 これを小数点以下3桁を四捨五入して、小数点以下1桁表示の1.2と表示させたいのですが、可能でしょうか?
- ベストアンサー
- オフィス系ソフト
- 少数点以下2桁以上の入力でエラーメッセージを表示するには
データの入力規則で、少数点以下2桁以上の数値が入力されたらエラーメッセージが表示されるようにできないでしょうか? (小数点以下1桁[3.2→OK] 小数点以下2桁[3.26→エラーメッセージ]) または、条件付き書式で上記条件でセルの色を変えることはできますか? よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセルで整数表示と少数表示を混在させたい
お世話になります。 集計用のファイルを作っています。 整数と、小数点以下1桁、2桁の数値が出てきます。 書式設定で小数点以下2桁まで表示するようにしたら、整数や小数点以下1桁の数値まで120.00とか25.50と表示されてしまい、見にくくなってしまいました。 小数点以下に0がつく場合は無視して、それぞれ120、25.5、3.25のように必要な桁数だけ表示させたいのですが、どうしたらよいでしょうか。
- ベストアンサー
- オフィス系ソフト
- 電卓の表示(いつもは0桁、割り切れないとき2桁)
キャノンのHS-1220TUGという電卓使ってます。 計算後の答えなんですが、割り切れないときだけ小数点2桁表示(3桁目を四捨五入)で、それ以外は0桁に表示するやり方ありませんか? いつもはFで四捨五入してるんですが、これだといつも小数点2桁まで表示されちゃうから見づらいんです。
- 締切済み
- 数学・算数
- 18桁の割り算をしたい
それほど多くはないですが、今の仕事で分母が18桁、分子が16桁の分数を小数に計算をしなくてはならなくなりました。(小数点以下5桁ほど) 手持ちの計算機ではできず困っています。 何か、計算できるソフトのようなものがあれば教えて下さい。
- ベストアンサー
- 数学・算数
- 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セルに6桁以上入力できない。小数点以下の表示が00になってしまう。
エクセルの1つのセルに1,000,000と入力するも1,000となってしまいます。 数式と値をクリアにしても、表示形式を標準や数値や文字列に設定しても下3桁が入りません。 それと小数点第2位まで計算したいのに、小数点第2位は.00なってしまいます。 それと小数点以下を切り捨てで表示させたいのに、四捨五入になってしまいます。
- ベストアンサー
- Windows XP
- Accessの桁区切りについて教えてください。
アクセスのレポートの金額に、桁区切りのカンマを付けたいと思っています。 プロパティの書式を通貨にすると¥マークがついてしまいます。 合計は付いてもいいのですが、内訳には¥マークを付かないように桁区切りだけにしたいのです。 そのため、書式に『###,##0』としました。 できましたが、小数点以下が表示されません。 小数点を表示したいので『###,##0.###』としたら、『59,180.000』となってしまいます。 小数点の指定を自動から3桁表示に変えましたが、うまくいきません。 教えていただきたい内容としては、 ・金額の表示に桁区切りのカンマを付けたい。 ・でも¥マークは付けたくない。 ・小数点以下該当があるもののみ3桁まで表示させたいが(5,500.365)、 小数点以下がないものは小数点以下は表示させたくない(5,400)。 ぜひともアクセスを使いこなしている方、お教えください。
- 締切済み
- オフィス系ソフト
- 計算する度にBigDecimalオブジェクト作成?
javaのDouble型の足し算をするには、BigDecimalを使わなければ 正確な数値が得られない、ということで使用したのですが、 毎回、小数点の足し算をする度に、 負荷のかかるnew宣言でBigDecimalのインスタンスを作りaddメソッドで計算するというはどうも非効率に思ってしまうのです、、; javaでの小数点の足し算は皆さん通常どうやっているのでしょうか?
- ベストアンサー
- Java
- テキストボックスの少数点以下表示について
お願いします。 アクセス2002を使っています。 フォームのテキストボックスの数値表示についてお尋ねします。 たとえば「1.75」という小数点以下2桁まで表示させたいのですが、コントロールで書式を「標準」に、小数点以下表示桁数を「2」と指定しても結果は「2.00」と表示されます。 入力した1.75をそのまま1.75で表示させるにはどうすればいいのでしょうか。 宜しくお願いします。
- ベストアンサー
- その他(データベース)
お礼
回答ありがとうございます。 サンプルのほうですが、コピペで試させていただきましたがRoundingModeでエラーが出てしまいます。 setScaleではなく、divideで行ってみたのですが結果は同じでした。。。