java - 如何处理 Java 的 BigDecimal 中的舍入错误

标签 java bigdecimal

我正在使用在 java 应用程序中实现脚本引擎的开源项目 (axil),并且在尝试利用 BigDecimal 的舍入时遇到了一个主要的绊脚石。似乎 BigDecimal 正在将我的输入转换为科学记数法,然后将我传递的精度应用于数字的 SN 表示的系数,而不是它的非 SN 表示。例如:
new BigDecimal("-232454.5324").round(new MathContext(2, RoundingMode.HALF_UP)).toString()
产生 -2.3E+5 的结果.这给我带来了两个问题。首先,我期待 -232454.5 的结果( -2.324545E+5 ),所以得到 -230000抛出任何涉及结果的数学。其次,我不期望,也找不到解决方法,在 SN 中获得结果(尽管我希望有一种我还没有偶然发现的格式化方法)。

现在由于项目的性质,我们可以对传入 round() 方法的数字的大小/类型做出很少的期望,因此任何解决方案都需要高度模块化。有没有人有什么建议? If it would be helpful here's a link to the google code issue report for this bug in the project. And here is a link to the project homepage.

很感谢任何形式的帮助。

最佳答案

不要使用 round 方法,而是使用 setScale ,其中参数是小数位数:

BigDecimal bd = new BigDecimal("-232454.5324").setScale(1,
                RoundingMode.HALF_UP);
String string = bd.toPlainString();
System.out.println(string); // prints -232454.5

另请注意, setScale 返回一个新的 BigDecimal 实例,它不会更改当前实例的比例。

关于java - 如何处理 Java 的 BigDecimal 中的舍入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10883308/

相关文章:

java - 将 ".00"添加到 Java 中的整数 BigDecimal

java - java - 如何在java中将带有美元符号的字符串数值转换为BigDecimal?

java - 如何在 Java 中识别 BigDecimal 和 Double

java - 用于 Java 1.4 的 JUnit

java - 如何在 Maven 中组装多模块项目

java - 如何计算年龄或java中两个日期之间的差异

java - 为什么我的 BigDecimal 计算不起作用?

在传输之前Java解码编码的LDAP过滤器?防止 LDAP 注入(inject)

java - 从 Java 读取 COBOL 数据结构

java - 无法在 Java 中将 bigdecimal 转换为字符串