1

我正在尝试使用 Big decimal 将双精度数舍入,然后与另一个数字进行比较例如:

    // 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.1419 舍入到小数点后 3 位应该是 3.142。有人可以告诉我代码有什么问题吗?

4

3 回答 3

3

precision并且scale不是一回事,看来您将两者混淆了。 scale是小数点右边的位数。 precision是总位数。

更改所有对 to 的引用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 回答