Java 大十进制问题
我使用java大十进制如下:
class test bigDecimal{
private BigDecimal decimalResult;
public boolean iterate(String value) {
if (value == null) {
return true;
}
System.out.println("value is: " + value);
BigDecimal temp = new BigDecimal(value);
System.out.println("temp val is: " + temp);
if (decimalResult == null) {
decimalResult = temp;
} else {
decimalResult = decimalResult.add(temp);
}
return true;
}
}
我用来创建大十进制的所有字符串的比例为6。例如:123456.678000、456789.567890
但是如果我给出一个大的字符串列表作为输入并检查总和,我得到输出小数点后8位。例如。类似:2939166.38847228。
我想知道为什么 BigDecimal 会改变这个比例?我所有的输入都是 6 级。
任何输入都会受到赞赏。 -谢谢
I am using java big decimal as follwing:
class test bigDecimal{
private BigDecimal decimalResult;
public boolean iterate(String value) {
if (value == null) {
return true;
}
System.out.println("value is: " + value);
BigDecimal temp = new BigDecimal(value);
System.out.println("temp val is: " + temp);
if (decimalResult == null) {
decimalResult = temp;
} else {
decimalResult = decimalResult.add(temp);
}
return true;
}
}
all the strings that I am using to create big Decimal have scale of 6. For eg: 123456.678000, 456789.567890
But If I give a big list of strings as input and check the sum, I get output with 8 digits after decimal point. for eg. something like: 2939166.38847228.
I wonder why does BigDecimal change this scale ? all my input has scale of 6.
Any inputs are appreciated.
-thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
请阅读 BigDecimal 的 javadoc:
http://download.oracle.com/javase/6 /docs/api/java/math/BigDecimal.html
在内部,所有 BigDecimal 都会转换为某种内部格式。
如果您想获得特定的格式,则必须将其称为适当的格式。
例如,您可以将
scaleByPowerOfTen(int n)
与 n=6 一起使用哦,顺便说一句,永远不要使用
new BigDecimal
,请使用BigDecimal.valueOf
反而。编辑:
NumberFormat numberFormat = NumberFormat.getInstance(); // 此处使用区域设置
格式化字符串 = df.format(myUnformatedBigDecimal);
Please read the javadoc for BigDecimal:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html
Internally all BigDecimals get converted to a some internal format.
If you want to get a specific format you have to call it appropriate.
You could use
scaleByPowerOfTen(int n)
with n=6 for exampleOh, and by the way never use
new BigDecimal
, useBigDecimal.valueOf
instead.EDIT:
NumberFormat numberFormat = NumberFormat.getInstance(); // use a locale here
String formated = df.format(myUnformatedBigDecimal);
这不是内部代表的问题。这样 BigDecimal.toString() 就可以工作了。它调用layoutChars(true)——格式化数字的私有方法。它的硬编码比例为 6。但我认为这并不重要。您实际上不必打印所有数字。 BigDecimal 提供计算高精度数字的能力。这就是它的作用。
It is not a problem of internal representation. This way the BigDecimal.toString() works. It calls layoutChars(true) - the private method that formats number. It has hard coded scale of 6. But I think it does not matter. You do not really have to pint all digits. BigDecimal provides ability to calculate high precision numbers. That's what it does.
大十进制给出了精确的输出,但该输出比 6 位数字更准确,因此获得 6 位输出的最佳方法是通过将 BigDecimal 转换为字符串并执行类似的操作来删除最后 2 位小数:
Big decimal is giving an exact output, but that output is more accurate than 6 digits, so the best way to get 6 digit output is removing the last 2 decimals by converting the BigDecimal into string and doing something like that: