1

我试图让用户以自己的风格自由输入数字,就像他可以选择输入 2 或 2.00 一样,但正如您所知,双精度数不能接受这个 (2)。我希望双精度只接受小数点后 2 位(基本上我代表金钱)。这就是我不确定如何获取输入并将其转换为 2decimals 格式的内容。java.tks 的新手

试过谷歌,但找不到我可以在输入本身格式化的地方,这意味着甚至不要让用户输入除 2 个小数位以外的任何小数位,而不是在输入多个不同的变量后进行后处理。,tks

public static void add()
{
 double accbal;
   Scanner sc = new Scanner(System.in);
    DecimalFormat df = new DecimalFormat("0.00");

        System.out.println("Enter account balance");
        accbal =  sc.nextDouble();
 //this is the part where i need to know the entered value is formated to only 2 decimal places

}
4

3 回答 3

1

试试这个:

    DecimalFormat  df = new DecimalFormat ("#.##");//format to 2 places
    accbal =  sc.nextDouble();
    System.out.print(df.format(aacbal));//prints double formatted to 2 places

但是我看到你说:

试过谷歌,但找不到我可以在输入本身格式化的地方,这意味着甚至不要让用户输入除 2 个小数位以外的任何小数位

如果出于某种原因以上是您的意图,那么只需使用读取输入nextLine(),然后检查以确保在小数点后它的长度仅为 2:

double accbal=0;
Scanner sc = new Scanner(System.in);

while (true) {
    System.out.println("Enter account balance");
    String s = sc.nextLine();

    if (s.substring(s.indexOf('.') + 1).length() <= 2)//accept input and convert to double
    {
        accbal = Double.parseDouble(s);
        break; //terminates while loop
    } else {
        System.out.println("Incorrect input given! Decimal places cant exceed 2");
    }
}
System.out.println("Balance: "+accbal);
于 2012-08-19T16:05:09.673 回答
1

由于显示小数位对最终用户来说实际上是一种形式,因此您可以将您的值读取为 aString并将其转换为 a Doubleor BigDecimal,如果您正在处理实际财务问题,则后者是首选。

相关: 每个计算机科学家都应该知道的关于浮点运算的知识

public static void add() {
    BigDecimal accbal; // could declare a Decimal
    Scanner sc = new Scanner(System.in);
    DecimalFormat df = new DecimalFormat("#.00");

    System.out.println("Enter account balance");
    accbal = new BigDecimal(sc.nextLine());
    System.out.println(df.format(accbal.doubleValue()));

}
于 2012-08-19T16:12:24.597 回答
0

如果您想接受“#.##”形式的输入,只需为Scanner.hasNext:-)指定自定义正则表达式

final Scanner input = new Scanner(System.in);
final Pattern pattern = Pattern.compile("\\d+\\.\\d{2}?");
while (input.hasNext()) {
  System.out.println((input.hasNext(pattern) ? "good" : "bad")
    + ": " + input.nextDouble());
}

使用以下输入:

2.00
3.14159
2

结果是:(也在这里找到)

good: 2.0
bad: 3.14159
bad: 2.0

通过这种方式,您可以验证他们输入的金额有两位小数。


即使您说您想要一个简单的后处理解决方案,如果您已经有一个金额并希望将其转换为使用 2 个小数位,并且您专注于精度(因为这是金钱),也许可以尝试使用BigDecimal- 特别是,请参阅BigDecimal.setScale

while (input.hasNextBigDecimal()) {
  System.out.println(input.nextBigDecimal().setScale(2, RoundingMode.HALF_UP));
}

因此输出是:

2.00
3.14
2.00
于 2012-08-19T16:15:49.470 回答