我有两个双倍值
double a = 1.07522;
double b = 1.0752;
并舍入乘数值
public static final double ROUND_MULTIPLIER = 100000.0;
所以总是应该有5个小数位。
我需要减去两个double值并将结果作为a - b = 0.00002
。
如何使用ROUND_MULTIPLIER
?
我尝试使用BigDecimal作为
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER));
但它并不总是有效,有时会返回2E-16,当尝试添加第二个值时会返回奇怪的值,如下所示
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));
我需要使用ROUND_MULTIPLIER
。
答案 0 :(得分:1)
我不明白为什么你必须使用ROUND_MULTIPLYER以及它存在的确切原因是什么,所以我只能猜测。
强制代码使用ROUND_MULTIPLYER:
public static final double ROUND_MULTIPLIER = 100000.0;
public void foobar()
{
double a = 1.07522;
double b = 1.0752;
BigDecimal opA = BigDecimal.valueOf(a);
BigDecimal opB = BigDecimal.valueOf(b);
BigDecimal result = opA.subtract(opB);
result = result.multiply(BigDecimal.valueOf(ROUND_MULTIPLIER));
int cutResult = result.intValue();
result = BigDecimal.valueOf(cutResult / ROUND_MULTIPLIER);
System.out.println(result);
}
这是
的输出 0.000020
这就是你想要的吗?代码绝对是优化的对象,但我让你这样做; - )
答案 1 :(得分:0)
使用bigDEcimal并设置比例,给出您需要的小数位数
final BigDecimal a = new BigDecimal(1.07522);
final BigDecimal b = new BigDecimal(1.0752);
final BigDecimal result = a.subtract(b);
int newScale = 10; //10 decimals
System.out.println(result.setScale(newScale, BigDecimal.ROUND_UP));
答案 2 :(得分:0)
BigDecimal decimal = new BigDecimal(1.07522);
BigDecimal decimal1 = new BigDecimal(1.0752);
System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));
答案 3 :(得分:0)
BigDecimal是要走的路,但是如果你将 ROUND_MULTIPLIER 转换为int,为什么它是一个double值。也许这就是你从哪里得到你的问题?用int乘数给它一个旋转:)
编辑:使用setScale()
设置正确的舍入模式通常是更好的选择,但是你坚持使用乘数,对吗?