我正在尝试找出对价格进行两位小数缩放的最佳方法。
所以这是场景。假设我的全价为 100.00
,折扣后您支付 90
。因此折扣百分比为 10%
。为了实现这一点,我写了类似的东西,效果很好
BigDecimal grossPrice = new BigDecimal(100);
BigDecimal discountedPrice = new BigDecimal(90);
BigDecimal.ONE.subtract(discountedPrice.divide(grossPrice,2, RoundingMode.HALF_EVEN))
.multiply(BigDecimal.valueOf(100))
.setScale(2, RoundingMode.HALF_EVEN)
.doubleValue();
但是一旦我将discountedPrice更改为89.5
,并且我预计折扣百分比为10.5
,但我仍然得到10,原因很清楚,因为89.5/100
给出 0.895
,因为它的一半甚至将其四舍五入为 0.9
,所以仍然是 10%
如果我做HALF_UP
,它和half_even一样好。如果我这样做,HALF_DOWN
,该值将为 0.89
,我的折扣百分比将为 11
。因此,我有点困惑,在这种情况下,什么实际上会给我 10.5%
折扣。
最佳答案
将比例设置为3
怎么样?请记住将其更改为两个位置:
- 在你分开的地方,
- 四舍五入到一半的位置。
BigDecimal grossPrice = new BigDecimal(100);
BigDecimal discountedPrice = new BigDecimal("89.5");
double doubleValue = BigDecimal.ONE
.subtract(discountedPrice.divide(grossPrice,3, RoundingMode.HALF_EVEN)) // here
.multiply(BigDecimal.valueOf(100))
.setScale(3, RoundingMode.HALF_EVEN) // here
.doubleValue();
System.out.println(doubleValue); // 10.5
您可能想要定义 MathContext
来支持您的计算并避免拼写错误:
MathContext halfEvenTo3 = new MathContext(3, RoundingMode.HALF_EVEN);
BigDecimal grossPrice = new BigDecimal(100);
BigDecimal discountedPrice = new BigDecimal("89.5");
double doubleValue = BigDecimal.ONE
.subtract(discountedPrice.divide(grossPrice, halfEvenTo3)) // here
.multiply(BigDecimal.valueOf(100))
.round(halfEvenTo3) // here
.doubleValue();
System.out.println(doubleValue); // 10.5
关于java - BigDecimal 和价格缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66227080/