【问题标题】:Java BigDecimal divide and multiply and round to 2 decimalsJava BigDecimal 除法和乘法四舍五入到小数点后两位
【发布时间】:2021-03-13 21:28:24
【问题描述】:

我有一个 Java BigDecimal 表达式,如下所示:

(totalPrep.divide(totalCase, 2, BigDecimal.ROUND_HALF_UP)).multiply(new BigDecimal(100))

在哪里

BigDecimal totalCase = BigDecimal.ZERO; BigDecimal totalPrep = BigDecimal.ZERO;

我必须将 totalPrep 与 totalCase 相除,然后将结果乘以 100 以获得以 % 为单位的结果值。 66.6666666666666666666666666666666666667

假设总 prep 是二进制 2,toalCase 是 3,那么数学结果是 66.6666666666666666666666666666666666667。我想将其连接到小数点后 2 位 66.67%

有什么建议吗?

【问题讨论】:

  • 我认为 BigDecimal 是一种浮点数。您可以控制精度的总位数,而不是小数点后的位数。所以有一个小问题要开始。
  • 所以我认为通常你最终会在打印时四舍五入输出,而不是实际数字本身。我只是碰巧在我的声誉变化中很方便:stackoverflow.com/questions/54121319/…
  • 这也可能是您正在寻找的:stackoverflow.com/questions/3395825/…
  • 仅供参考: 自 Java 1.5 起,将 BigDecimal.ROUND_HALF_UP 替换为 RoundingMode.HALF_UP。旧版本自 Java 9 起已弃用。
  • 顺便说一句,如果这是一个百分比分割,你不会期望它们总是加起来为 100...

标签: java bigdecimal


【解决方案1】:

如果你想让2 / 3 得到66.67,你需要先乘,然后除并四舍五入到小数点后两位:

BigDecimal totalPrep = BigDecimal.valueOf(2);
BigDecimal totalCase = BigDecimal.valueOf(3);

BigDecimal result = totalPrep.multiply(BigDecimal.valueOf(100))
                             .divide(totalCase, 2, RoundingMode.HALF_UP);

System.out.println(result); // prints: 66.67

这将计算2 * 100 = 200,然后是200 / 3 = 66.67(四舍五入)

当你先除法时,你计算2 / 3 = 0.67(四舍五入),然后是0.67 * 100 = 67.00,这显然不是你想要的。

【讨论】:

  • 没关系,但 BigDecimal 有 scaleByPowerOfTen(int n),这只是在 n=2 的情况下乘以 100 的一种更简洁的方法。
  • 您也可以声明MathContext mc = new MathContext(4),然后这样使用它:BigDecimal result = totalPrep.multiply(BigDecimal.valueOf(100)).divide(totalCase,mc); 只是获得所需输出的另一种方式
  • @p_flame 不能使用new MathContext(4),因为我们不知道结果的大小。结果应该是具有 2 位小数精度的百分比,但由于我们不知道小数点前的实际小数位数,因此我们不知道使用什么整体精度。
  • @Persixty 我更喜欢movePointRight(2) 而不是scaleByPowerOfTen(2)。 --- 考虑到已经存在的movePointRight,scaleByPowerOfTen 似乎是多余的,所以我想知道为什么他们在 Java 1.5 中添加了新方法,只是较新的scaleByPowerOfTen 可能会导致负比例。
  • @Persixty 我一般不喜欢正指数的科学记数法,即负数的BigDecimal。我更喜欢5 * 100 = "500" 和5.movePointRight(2) = "500",而不是"5E+2" 调用5.scaleByPowerOfTen(2) 的结果(其中5 当然是BigDecimal)。我猜这只是个人喜好。
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多