我正在使用在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.
很感谢任何形式的帮助 .
3 回答
不要使用round方法,而是使用setScale,其中argument是小数位数:
另请注意,setScale返回一个新的BigDecimal实例,它不会更改当前实例的比例 .
我会那样做:
MathContext
采用精度,即结果中有效位的总数 - 小数位前后的总数 .BigDecimal
的逻辑在这里是正确的 .