我正在尝试使用大小数舍入一个双精度数,然后与另一个数字进行比较例如:
// 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。有人可以告诉我代码有什么问题吗?
答案 0 :(得分:3)
precision
和scale
不是一回事,看起来你会混淆两者。 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);