Java 大十进制问题

发布于 2024-11-19 19:37:02 字数 761 浏览 0 评论 0原文

我使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浮光之海 2024-11-26 19:37:02

请阅读 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 example

Oh, and by the way never use new BigDecimal, use BigDecimal.valueOf instead.

EDIT:

NumberFormat numberFormat = NumberFormat.getInstance(); // use a locale here
String formated = df.format(myUnformatedBigDecimal);

唯憾梦倾城 2024-11-26 19:37:02

这不是内部代表的问题。这样 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.

傾城如夢未必闌珊 2024-11-26 19:37:02

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

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

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:

    String myOutput = new 
    BigDecimal("1000.12345678").toString();
    myOutput = myOutput.substring(myOutput.length-2, 
     myOutput.length);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文