首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigDecimal -意外的循环行为

BigDecimal -意外的循环行为
EN

Stack Overflow用户
提问于 2022-09-10 11:03:44
回答 1查看 67关注 0票数 0

我想我找到了一个窃听器:

代码语言:javascript
复制
MathContext mathContext = new MathContext(5, RoundingMode.HALF_UP);
result = BigDecimal.valueOf(0.004798).round(mathContext); // fails
// result is 0.004798!!! (same value)

我不得不使用以下备选方案:

代码语言:javascript
复制
BigDecimal bigDecimal = BigDecimal.valueOf(0.004798);
BigDecimal new_divisor = BigDecimal.valueOf(1, 5);
bigDecimal_array = bigDecimal.divideAndRemainder(new_divisor);
MathContext mathContext = new MathContext(5, RoundingMode.HALF_UP);
result = bigDecimal.subtract(bigDecimal_array[1], mathContext);
result = result.stripTrailingZeros();

在我看来,这个错误(如果是的话)是非常危险的。

EN

回答 1

Stack Overflow用户

发布于 2022-09-10 11:19:10

不,没有窃听器。你只是误解了“精确”的意思。

来自BigDecimal's documentation

要返回的数字总数由MathContext的精度设置指定;这决定了结果的精度。数字计数从精确结果的最左边的非零数字开始。

(强调我的)。

在这种情况下你有4位数。因此,任何大于或等于4的精度都不会对四舍五入产生影响。

相比较

代码语言:javascript
复制
result = BigDecimal.valueOf(0.004798).round(new MathContext(3, RoundingMode.HALF_UP));
result ==> 0.00480

或使用

代码语言:javascript
复制
jshell> result = BigDecimal.valueOf(1.004798).round(new MathContext(5, RoundingMode.UP));
result ==> 1.0048

表现得和你期望的一样。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73671276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档