用乘数减去双精度值并四舍五入
Subtract and round double values by multiplier
我有两个双精度值
double a = 1.07522;
double b = 1.0752;
和舍入乘数值
public static final double ROUND_MULTIPLIER = 100000.0;
所以总是应该有 5 位小数。
我需要减去两个双精度值并得到结果 a - b = 0.00002
。
如何使用 ROUND_MULTIPLIER
执行此操作?
我尝试使用 BigDecimal 作为
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER));
但它并不总是有效,有时 return 2E-16,当尝试添加到第二个值时它 return 是一个奇怪的值
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));
我需要使用 ROUND_MULTIPLIER
.
使用 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));
BigDecimal decimal = new BigDecimal(1.07522);
BigDecimal decimal1 = new BigDecimal(1.0752);
System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));
BigDecimal 是要走的路,但为什么 ROUND_MULTIPLIER 无论如何都将其转换为 int 是双精度值。也许那是您从哪里得到四舍五入的问题?用 int-multiplier 试一试 :)
编辑:使用 setScale()
设置适当的舍入模式通常是更好的选择,但您坚持使用乘数,对吗?
我不明白为什么你必须使用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
这是你想要的吗?代码绝对反对优化,但我让你去做 ;-)
我有两个双精度值
double a = 1.07522;
double b = 1.0752;
和舍入乘数值
public static final double ROUND_MULTIPLIER = 100000.0;
所以总是应该有 5 位小数。
我需要减去两个双精度值并得到结果 a - b = 0.00002
。
如何使用 ROUND_MULTIPLIER
执行此操作?
我尝试使用 BigDecimal 作为
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER));
但它并不总是有效,有时 return 2E-16,当尝试添加到第二个值时它 return 是一个奇怪的值
BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));
我需要使用 ROUND_MULTIPLIER
.
使用 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));
BigDecimal decimal = new BigDecimal(1.07522);
BigDecimal decimal1 = new BigDecimal(1.0752);
System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN));
BigDecimal 是要走的路,但为什么 ROUND_MULTIPLIER 无论如何都将其转换为 int 是双精度值。也许那是您从哪里得到四舍五入的问题?用 int-multiplier 试一试 :)
编辑:使用 setScale()
设置适当的舍入模式通常是更好的选择,但您坚持使用乘数,对吗?
我不明白为什么你必须使用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
这是你想要的吗?代码绝对反对优化,但我让你去做 ;-)