我正在尝试模拟自动柜员机的金额输入Java,即。假设用户不断输入"1",则显示的数量应为:
0.00
0.01
0.11
1.11
11.11
111.11我尝试了Double和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没有这个问题)还是我做错了什么?
发布于 2014-06-11 00:18:36
最简单的选择可能是将输入记录为字符串。每次按键后,将新字符追加到其末尾,并通过创建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发布于 2014-06-11 00:20:36
Java BigDecimal有一个接受双精度值的构造函数和另一个接受字符串的构造函数。您使用的是double构造函数,但通常推荐使用string构造函数。你试过了吗?
BigDecimal addend = new BigDecimal("0.01");
有关详细信息,请参阅The Evil Big Decimal Constructor。
发布于 2014-06-11 00:14:52
更容易弄乱字符串:
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。
https://stackoverflow.com/questions/24145753
复制相似问题