java - BigDecimal 和价格缩放

标签 java bigdecimal

我正在尝试找出对价格进行两位小数缩放的最佳方法。

所以这是场景。假设我的全价为 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/

相关文章:

java - 当我在另一个静态类下使用静态类时验证 instanceof

java - 在Java中检查BigDecimal小单位的最佳方法

java - 如何在 swing GUI 中使用 BigDecimal?

java - 将 BigDecimal 舍入到最接近的 5 美分

java - BigDecimal 带刻度除法

java - 在没有科学记数法的情况下格式化字符串中的 double

java - 如何将对象插入到h2

传递到新窗口的 JavaFX 参数变为 NULL

java - JOptionPane 的属性更改值是多少以及何时更改?

java - RestAssured 调用 https get api 给出错误