向下舍入一个双倍并与另一个数字进行比较

时间:2012-08-02 20:11:02

标签: java bigdecimal

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

    // 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。有人可以告诉我代码有什么问题吗?

3 个答案:

答案 0 :(得分:3)

precisionscale不是一回事,看起来你会混淆两者。 scale是小数点右边的位数。 precision是总位数。

将您对precision的所有引用更改为scale,它应该有效(但您必须选择UNNECESSARY以外的舍入模式。)

答案 1 :(得分:1)

以下是您尝试实现的完整示例:

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

答案 2 :(得分:0)

我会使用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);