2014-06-10 113 views
1

我想模拟在Java中的金额输入,即。说用户保持输入“1”,显示的金额应该是:Java BigDecimal /双精度错误

0.00 
0.01 
0.11 
1.11 
11.11 
111.11 

我都尝试双人床和BigDecimal的处理:

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) 

但是双方似乎不是表明这样的:

0.00 
0.01 
0.11 
1.11 
11.1 <<< missing the 0.01 at the end 
111.01 

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

+0

可能重复的[是浮点数学破?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+4

恕我直言,你不应该使用BigDecimals或双倍货币。如果你想最精确的转换成便士。并直接与那些人合作。 –

+0

你的代码看起来不错,但你的'println'行的操作顺序可能会让事情变得糟糕。如果将“+”“'移动到最后会发生什么? –

回答

0

它更容易惹字符串:

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

2

最简单的“”选项可能是将输入记录为字符串。每按一次键之后追加新角色,以它的结束,并通过创建一个BigDecimal和100

String input = "111111"; 
BigDecimal value = new BigDecimal(input).divide(new BigDecimal(100)); // 1111.11 

在于:所述划分它格式化数字,我只是想你的代码在一个循环中,它似乎工作正常。您需要发布显示您如何生成current的代码。

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 
0

为什么要计算飞行中的金额?只需存储字符串,并在最后解析它。

// Store user input as string (pseudo code) 
String readUserInput() { 
    String accumulator = ""; 
    while (user input available) { 
    accumulator += user input; 
    } 
    return accumulator; 
} 

// Get user input as double 
Double getAmount(String input) { 
    return Double.parseDouble(input)/100.0; 
} 

// Or a BigDecimal too 
BigDecimal getAmount(String input) { 
    return new BigDecimal(input).divide(new BigDecimal(100)); 
} 
1

Java BigDecimal具有一个构造函数,它接受一个double而另一个接受一个字符串。您正在使用双重构造函数,但通常建议使用字符串构造函数。你试过了吗?

BigDecimal addend = new BigDecimal("0.01");

欲了解更多信息,请参阅The Evil Big Decimal Constructor