所以我有精确问题

时间:2018-02-26 05:54:39

标签: java

所以我在货币面额上使用java。大部分代码工作正常,但唯一的问题是便士。我遇到的问题是,在输入一定金额时,它会不会遗漏1个便士。显然我们假设使用math.round()将double值转换为等价的long值,如果我们想要精度,则表示美分....但我遇到的最大问题是我甚至不明白这意味着什么,甚至更不用说了解如何实现math.round()。 我们也给了这个.... Math.round(金额* 100)。我没有期待任何答案,但如果有人能给我任何明确或指示,你可以指出我。我很高兴地欣赏它,因为我现在真的很困惑和卡住了。

import java.util.Scanner;

public class MoneySorter {

  public static void main(String[] args) {

    Scanner stdin = new Scanner(System.in);

    double money;
    System.out.printf("");
    money = stdin.nextDouble(); 

    int hundreds, fifty, twenties, tens, fives, ones;

    int quarters, dimes, nickles, pennies;

    hundreds = (int) money / 100;
    money = money % 100;

    fifty = (int) money / 50; 
    money = money % 50;

    twenties = (int) money / 20; 
    money = money % 20;

    tens = (int) money / 10;
    money = money % 10;

    fives = (int) money / 5;
    money = money % 5;

    ones = (int) money / 1;
    money = money % 1;

    quarters = (int) (money / 0.25);
    money = money % 0.25;

    dimes = (int) (money / 0.10);
    money = money % 0.10;

    nickles = (int) (money / 0.05);
    money = money % 0.05;

    pennies = (int) (money / 0.01);

如果我输入金额,则会有一些例子:0.99

 Result:
 3 Quarters
 2 Dimes
 3 Pennies

示例2:127.97

 1 Hundred
 2 Twenties
 1 Five
 2 Ones
 3 Quarters
 2 Dimes
 1 Penny

2 个答案:

答案 0 :(得分:1)

不要声明:

double money;

...而是声明:

long money;

然后替换:

money = stdin.nextDouble();

...与:

money = Math.round(stdin.nextDouble() * 100);

现在意识到你以便士为主要货币单位,而不是美元。这意味着您必须将后面的大部分乘以100.例如:

hundreds = (int) money / 10000;
money = money % 10000;

等等,直到你到达:

nickles = (int) (money / 5);
money = money % 5;

pennies = (int) money;

答案 1 :(得分:0)

如果应用程序正在处理货币计算,最好使用BigDecimal。 BigDecimal类用于执行高精度算术,可用于基于银行或金融域的应用程序 https://www.w3resource.com/java-tutorial/java-big-decimal-class.php

BigDecimal money;
System.out.printf("Enter the value: ");
money = new BigDecimal(stdin.nextDouble());

BigDecimal hundreds;

hundreds = money.divide(new BigDecimal(100), RoundingMode.CEILING).setScale(2);