Java大十进制问题

Java大十进制问题,java,bigdecimal,Java,Bigdecimal,我使用java大十进制,如下所示: class test bigDecimal{ private BigDecimal decimalResult; public boolean iterate(String value) { if (value == null) { return true; } System.out.println("value is: " + value); BigDe

我使用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、4567889.567890

但是,如果我给出一个大的字符串列表作为输入,并检查总和,我会得到小数点后8位的输出。例如:2939166.38847228

我想知道为什么BigDecimal会改变这个比例?我所有的输入都是6级的

欢迎您的任何意见。
-谢谢

请阅读关于BigDecimal的javadoc: 在内部,所有的大小数都转换成某种内部格式

如果你想得到一个特定的格式,你必须称之为适当的。 例如,可以使用n=6的
scaleByPowerOfTen(int n)

哦,顺便说一下,不要使用新的BigDecimal,而是使用BigDecimal.valueOf

编辑:

NumberFormat NumberFormat=NumberFormat.getInstance();//在此处使用区域设置

String formatted=df.format(myUnformatedBigDecimal)

这不是内部表示的问题。这样BigDecimal.toString()就可以工作了。它调用layoutChars(true)——格式化数字的私有方法。它的硬编码刻度为6。但我认为这并不重要。你真的不必把所有的数字都品脱掉。BigDecimal提供了计算高精度数字的能力。它就是这样做的

Big decimal给出的是精确的输出,但该输出比6位更精确,因此获得6位输出的最佳方法是通过将Big decimal转换为字符串并执行类似操作来删除最后2位小数:

    String myOutput = new 
    BigDecimal("1000.12345678").toString();
    myOutput = myOutput.substring(myOutput.length-2, 
     myOutput.length);

你能发布一个说明这一点的帖子吗?lol@
任何输入都是值得赞赏的
:)输入大约有100万个这样的stribg值,它们被汇总为大十进制并被打印为字符串。对不起,你完全正确。我想到了BigInteger的内部表示。您应该使用如下内容:NumberFormat NumberFormat=NumberFormat.getInstance();//在此处使用区域设置字符串formatted=df.format(myUnformatedBigDecimal);关于不使用new,我有一个字符串,我正在使用它从字符串创建大十进制。valueOf仅接受长/双精度输入。在我的例子中,输入可以是21个字符,比long/double包含的字符多。