BigDecimalの常用方法、平方の差を求めて、(no exact representable decimal result)

4776 ワード


また久しぶりにブログを书いたので、先周末に书くつもりでしたが、风邪を引いて2日横になって、纸を3包み使いました.私も酔っ払うよ.今日はBigDecimalの一般的な方法を書き、平放差を求める方法も書きました.役に立つものや役に立つものは足跡を残してください.ははは...ありがとう....
       Javaがjava.mathパッケージで提供するAPIクラスBigDecimalは、16ビットを超える有効ビットの数を正確に演算するために使用されます.デュアル精度浮動小数点型変数doubleは16ビット有効数を処理できます.実際の応用では,より大きいまたはより小さい数の演算と処理が必要である.floatとdoubleは科学計算またはエンジニアリング計算にしか使用できません.ビジネス計算ではjava.math.BigDecimalを使用します.BigDecimalが作成するオブジェクトは、従来の+、-、*、/などの算術演算子を用いて直接そのオブジェクトを数学的に演算することはできず、対応するメソッドを呼び出す必要がある.
BigDecimalの一般的な方法:
public BigDecimal add(BigDecimal augend)    
public BigDecimal subtract(BigDecimal subtrahend)    
public BigDecimal multiply(BigDecimal multiplicand)    
public BigDecimal divide(BigDecimal divisor) 

メソッドはBigDecimalオブジェクトを返しますが、BigDecimalについてはどのように基本タイプに変換しますか?
ここではまず彼のよく使われるものを見てみましょう.
Constructor:
public BigDecimal(double val) (public BigDecimal(double val, MathContext mc))
public BigDecimal(int val)
public BigDecimal(long val)
public BigDecimal(String val)

上記各Constructorには、2つのパラメータの後のパラメータがMathContextとなっています.この構造は
 将 double 変換 BigDecimal(コンテキスト設定に従って丸められます).例:BigDecimal big = new BigDecimal(1.23d, MathContext.DECIMAL64);しかし、彼の方法の説明には、
The results of this constructor can be somewhat unpredictable and its use is generally not recommended; see the notes under the {@link #BigDecimal(double)} constructor
このコンストラクション関数は、一般的には予測不可能な結果を使用することを推奨しません.BigDecimal(double)という構造関数を見てください.
だから私たちはいつものその後ろにMathContextを持たない方法を使いましょう.
続き:構造を見終わって、彼のapiの中で提供した基本的なタイプに変換する方法を発見しました:
public int intValue(); BigDecimal     int;
public int doubleValue(); BigDecimal     double;

public int floatValue(); BigDecimal     float;
public int byteValue(); BigDecimal     byte;

ここではBigDecimalの変換の基本タイプのビット数に注意する.byteValue()のように - 127)の数は問題ありませんが、この範囲を超えると問題が発生します.ここでは、これが神馬のためであることを知っている人がいると思います.これは小さな問題ですが、コードを書くときは注意してください.時々書くのが速くて忘れてしまう.ははは.私はそうです.基本タイプに変換してここまで書きます.
上の4つの基本的な演算方法に戻ります.注意すべきは私たちの
public BigDecimal divide(BigDecimal divisor)

ここには時々
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。

        divide       :

NullPointerException - if divisor == null. 

ArithmeticException - if divisor == 0. 

ArithmeticException - if the result cannot be represented exactly



つまり,我々が伝達するパラメータは0であることが分かりやすい.もう一つは、この結果が正確に表現できないということです.結果はなぜクラスを正確に表現できないのですか?それは彼の結果が無限循環小数であることだ.だから私たちはこの方法で彼の別の方法を使ったほうがいいです.
public BigDecimal divide(BigDecimal divisor, int roundingMode);
は次のとおりです.

BigDecimal.divide(63.56f, BigDecimal.ROUND_HALF_UP)


これで解決です.後のパラメータについてはまだたくさんあるので、詳しくは言いません.自分でapiを見ます.
最後に、いくつかの方法を紹介します.
public BigDecimal abs()    。
public BigDecimal setScale(int newScale, int roundingMode)      。
public BigDecimal pow(int n)    。 :new BigDecimal(2).pow(2)==》4     4   2 2   4;

ここでBigDecimalはルートを開く方法を提供していません.私たちはMath.sqrt法を借りるしかありません.
次は、数のセットを求める平置きの方法です.
public BigDecimal getQuadraticByList(List xList,int newScale){
		BigDecimal sum = null;
		for (int i = 0; i < xList.size(); i++) {
			if (sum == null) {
				sum = xList.get(i);
			}else{
				sum = sum.add(xList.get(i));
			}	
		}
		BigDecimal sumAvg = sum.divide(new BigDecimal(xList.size()),BigDecimal.ROUND_HALF_DOWN);
		BigDecimal sumQuadratic = null;
		for (int i = 0; i < xList.size(); i++) {
			if (sumQuadratic == null) {
				sumQuadratic = xList.get(i).subtract(sumAvg).pow(2);
			}else{
				sumQuadratic = sumQuadratic.add(xList.get(i).subtract(sumAvg).pow(2));
			}
		}
		sumQuadratic = sumQuadratic.divide(new BigDecimal(xList.size()),BigDecimal.ROUND_HALF_DOWN);
		BigDecimal sumAvgQuadratic = new BigDecimal(Math.sqrt(sumQuadratic.doubleValue()));
		System.out.println(sumAvgQuadratic);
		sumAvgQuadratic = sumAvgQuadratic.setScale(newScale != 0 ? newScale : 20,BigDecimal.ROUND_HALF_DOWN);
		return sumAvgQuadratic;
	}
public BigDecimal getQuadraticByList(List xList,int newScale)                。      。
足跡を残してください...ガチャガチャ..