0

所以 BigDecimal 似乎无法存储像 1/3 的答案那样无限连续的数字。当我尝试这样做时,我得到以下信息:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

所以我决定使用RoundingMode. 当我这样做时(1/3)*3,我希望它以 1 的形式返回,而不是像 0.9 或 0.99 或 0.999 或任何类似的形式。但是,如果我要做 (1/3)*2,我不希望它四舍五入到 1。

4

3 回答 3

1

如果您的除数始终为 3,您可以使用放大 3 的整数进行数学运算以获得准确的结果,例如使用 2 表示 2/3,使用 1 表示 1/3。添加它们会得到 3,代表 3/3 = 1。

如果您需要各种除数,但仍然只能处理可以用分数表示的数字,您可能想看看这个问题:在 Java 中表示分数的最佳方法?

如果您还需要精确表示(并计算)无理数(例如 Pi 或 sqrt(2)),那么您可能不走运。请参阅此处:任何编程语言中的无理数表示?

于 2013-04-07T16:44:06.330 回答
0

如果您将数字四舍五入,您将丢失信息。使用 BigDecimal,除非再次对最终结果进行四舍五入,否则 (1/3)*3 永远不会得到 1。

于 2013-04-07T16:36:35.883 回答
0

看起来你需要四舍五入到小数点后 1 位,试试这个:

BigDecimal base = new BigDecimal("1.0");
BigDecimal result = base.divide(new BigDecimal("3"), 1, RoundingMode.HALF_UP);

在这里阅读文档

于 2013-04-07T16:33:43.460 回答