1

ビッグデシマルを使用して倍精度小数点を切り捨ててから、別の数値と比較しようとしています。次に例を示します。

    // Parse the string to extract the double and then put it into Big
    // decimal
    BigDecimal bdAns = BigDecimal.valueOf(Double.parseDouble("3.1419"));
    System.out.println(bdAns);
    BigDecimal bdCorr = BigDecimal.valueOf(Double.parseDouble("3.142"));
    System.out.println(bdCorr);
    System.out.println(bdCorr.precision() + " , " + bdAns.precision());
    // Round down the value of the bdAns, so that the precision of bdAns and
    // bdCorr matches. This code doesnt seem to work.
    bdAns = BigDecimal.valueOf(bdAns).setScale(bdCorr.precision(),
            BigDecimal.ROUND_UNNECESSARY);
    System.out.println(bdAns);
    System.out.println(bdAns.compareTo(bdCorr));

最後のprintlnは-1を出力していますが、小数点以下3桁に3.1419を四捨五入すると、3.142になります。誰かがコードの何が問題なのか教えてもらえますか?

4

3 に答える 3

3

precisionscaleは同じものではありません。2 つを混同しているようです。 scale小数点以下の桁数です。 precision総桁数です。

すべての参照を に変更するprecisionscale、動作するはずです (ただし、 以外の丸めモードを選択する必要がありますUNNECESSARY)。

于 2012-08-02T20:21:53.897 に答える
2

達成しようとしているものの全体的な例を次に示します。

import java.math.*;

public class bigdec {

    public static void main(String[] args) {
        BigDecimal dec1 = new BigDecimal("3.1419");
        BigDecimal dec2 = new BigDecimal("3.142");
        System.out.println("first - " + dec1);
        System.out.println("second - " + dec2);
        MathContext mc = new MathContext(dec2.scale() + dec1.toString().indexOf("."));
        dec1 = dec1.round(mc);
        System.out.println("AFTER ROUNDING");
        System.out.println("first - " + dec1);
        System.out.println("second - " + dec2);
        System.out.println(dec1.equals(dec2));
    }

}

dec1の小数点以下の桁数に基づいて丸められdec2ます。

于 2012-08-02T20:35:19.623 に答える
1

double と long を使用します

double d1 = 3.1419;
double d2 = 3.142;

long l1 = (long) (d1 * 100);
long l2 = (long) (d2 * 100);

// both l1 and l2 are 314

問題は、精度の setScale() を使用していることです。

 bdAns = bdAns.setScale(bdCorr.scale(), BigDecimal.ROUND_HALF_UP);
于 2012-08-02T20:20:12.070 に答える