当前位置: 首页 > 知识库问答 >
问题:

BigDecimal, setScale的问题

乌翰学
2023-03-14

我正在这样做:

(obj.getValue().divide(weight)).setScale(3, RoundingMode.HALF_DOWN)

我得到了这个错误:

java.lang.算术异常:非终止小数展开;没有精确可表示的小数结果。

我需要把setScale放在哪里?

谢谢

共有2个答案

慕容玉堂
2023-03-14

异常来自divide方法,因此无法在执行后更改某些内容。实际上,您应该将MathContext作为第二个参数传递给divide方法本身:

(obj.getValue().divide(weight, new MathContext(3, RoundingMode.HALF_DOWN)));

这样,您可以明确地说,您希望使用HALF_DOWN舍入模式除以保持3位数。

冯敏达
2023-03-14

或者您仍然拥有BigDecimal的其他公共方法:

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

应用到你的例子:

obj.getValue().divide(weight, 3, RoundingMode.HALF_DOWN);
 类似资料:
  • 描述 (Description) java.math.BigDecimal.setScale(int newScale)返回一个BigDecimal,其标度是指定值,其值在数值上等于此BigDecimal。 如果不可能,则抛出ArithmeticException。 此调用通常用于增加比例,在这种情况下,可以保证存在指定比例的BigDecimal和正确的值。 如果调用者知道BigDecimal在其

  • 问题内容: 这两个电话有什么区别?(有没有?) 问题答案: 提到但没有直接解决的一个重要问题是 “精度” 和 “比例” 之间的区别以及它们在两个语句中的用法。 “精度” 是数字中有效数字的总数。 “比例” 是小数点右边的位数。 MathContext构造函数仅接受precision和RoundingMode作为参数,因此第一条语句中从未指定scale。 显然接受scale和RoundingMode

  • 描述 (Description) java.math.BigDecimal.setScale(int newScale, RoundingMode roundingMode)返回一个BigDecimal,其标度是指定值,其未缩放值是通过将此BigDecimal的未缩放值乘以或除以适当的10的幂来确定的,以保持其整体值。 如果通过操作减小比例,则必须将未缩放的值除以(而不是相乘),并且可以改变该值;

  • 描述 (Description) java.math.BigDecimal.setScale(int newScale, int roundingMode)返回其规模为指定值的BigDecimal,其未缩放值通过将此BigDecimal的未缩放值乘以或除以适当的10的幂来确定,以保持其整体值。 如果通过操作减小比例,则必须将未缩放的值除以(而不是相乘),并且可以改变该值。 这里,指定的舍入模式应用

  • 我将以下代码与java BigDecimal setScale方法结合使用,并使用半\u偶数舍入模式,得到以下结果。 结果:1.11 预计:1.12 由于距离5最近的偶数数字应该是2,因此我预期的结果是1.12。但结果是1.11。再一次, 结果:1.15 预期:1.14 因为5左边的偶数是4,所以我希望结果是1.14。对此有什么解释吗?

  • 我们有以下代码: 我们正在对此进行单元测试,并根据是否在测试类上使用事务性测试得到不同的结果。 我只想知道我们是否应该期望的应用程序与一起考虑,还是在它之前考虑。 例如: 说: 价格=4.00 累计税收=1.20 您是否希望计算结果如下: a) <代码>4.00/1.20=3.33333333-- 或 b)<代码>4.00 / 1.20 = 3.33333333...-- 正如我所说,我们对这段代