首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal /双精度错误

Java BigDecimal /双精度错误
EN

Stack Overflow用户
提问于 2014-06-11 00:04:33
回答 4查看 1.1K关注 0票数 1

我正在尝试模拟自动柜员机的金额输入Java,即。假设用户不断输入"1",则显示的数量应为:

代码语言:javascript
复制
0.00
0.01
0.11
1.11
11.11
111.11

我尝试了Double和BigDecimal进行处理:

代码语言:javascript
复制
println( ((new BigDecimal(current)).multiply(new BigDecimal(10)).add(new BigDecimal(0.01))).setScale(2, RoundingMode.HALF_UP).toString()) )

println( "" + Double.parseString(current) * 10 + 0.01 )

然而,两者似乎都显示了这一点:

代码语言:javascript
复制
0.00
0.01
0.11
1.11
11.1 <<< missing the 0.01 at the end
111.01

它们都是由于精确的舍入错误(我以为BigDecimal没有这个问题)还是我做错了什么?

EN

回答 4

Stack Overflow用户

发布于 2014-06-11 00:18:36

最简单的选择可能是将输入记录为字符串。每次按键后,将新字符追加到其末尾,并通过创建BigDecimal并将其除以100来格式化数字。

代码语言:javascript
复制
String input = "111111";
BigDecimal value = new BigDecimal(input).divide(new BigDecimal(100)); // 1111.11

也就是说,我刚刚在一个循环中尝试了你的代码,它似乎工作得很好。您需要发布显示如何生成current的代码。

代码语言:javascript
复制
String current = "0.00";
for (int i = 0; i < 10; i++) {
    current = (new BigDecimal(current).multiply(new BigDecimal(10)).add(new BigDecimal(0.01))).setScale(2, RoundingMode.HALF_UP).toString();
    System.out.println(current);
}

//    0.01
//    0.11
//    1.11
//    11.11
//    111.11
//    1111.11
//    11111.11
//    111111.11
//    1111111.11
//    11111111.11
票数 2
EN

Stack Overflow用户

发布于 2014-06-11 00:20:36

Java BigDecimal有一个接受双精度值的构造函数和另一个接受字符串的构造函数。您使用的是double构造函数,但通常推荐使用string构造函数。你试过了吗?

BigDecimal addend = new BigDecimal("0.01");

有关详细信息,请参阅The Evil Big Decimal Constructor

票数 1
EN

Stack Overflow用户

发布于 2014-06-11 00:14:52

更容易弄乱字符串:

代码语言:javascript
复制
public void test() {
    String s = "0.00";
    for (int i = 0; i < 5; i++) {
        s = new BigDecimal(s.replaceAll(Pattern.quote("."), "") + "1").divide(ONEHUNDRED).toString();
        System.out.println(s);
    }
}

在这里,我去掉了".",添加了一个"1",从它创建一个BigDecimal,然后除以100。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24145753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档