使用Java更改计算器

问题描述 投票:1回答:4

我需要创建一个程序,以最有效的方式计算变化。防爆。 3个季度而不是75个便士。它只是单一的美元钞票,四分之一,硬币等。但是,我需要遵循一些规则。

1)将原始输入字符串的美元和美分组成分离为单独的子字符串。

2)使用Integer实用程序类将这两个子字符串解析为原始整数值。

3)您不得在工作中使用任何类型转换。

4)彻底测试以确保不存在舍入误差。

代码是我最初做的,但对于某些值我总是一分钱

public class ChangeCalculator
{
public static void Main (String args[]){
    double NumberOfMoney = Double.parseDouble(args [0]);
    int NumberOfCoins = (int)(NumberOfMoney * 100);

    System.out.println("Amount of Money: " + NumberOfMoney + "\n");

    int NumberOfDollars = (int)(NumberOfCoins/100);
    NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;
    System.out.println("Dollars: " + NumberOfDollars);

    int NumberOfQuarters = (int)(NumberOfCoins/25);
    NumberOfCoins = NumberOfCoins - 25 * NumberOfQuarters;
    System.out.println("Quarters: " + NumberOfQuarters);

    int NumberOfDimes = (int)(NumberOfCoins/10);
    NumberOfCoins = NumberOfCoins - 10 * NumberOfDimes;
    System.out.println("Dimes: " + NumberOfDimes);

    int NumberOfNickels = (int)(NumberOfCoins/5);
    NumberOfCoins = NumberOfCoins - 5 * NumberOfNickels;
    System.out.println("Nickels: " + NumberOfNickels);

    int NumberOfPennies = (int)(NumberOfCoins/1);
    NumberOfCoins = NumberOfCoins - 1 * NumberOfPennies;
    System.out.println("Pennies: " + NumberOfPennies);
}
}

输入$ 1.15应输出美元:1季度:0尺寸:1镍:1便士:0但它输出美元:1季度:0尺寸:1镍:0便士:4

java calculator calc
4个回答
2
投票

试试这个作为你在Main的第二行:

int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);

这是因为NumberOfMoney * 100114.999999999,所以(int)(NumberOfMoney * 100)114。一般来说,你应该小心不要相信doublefloat变量的值是准确的。


2
投票

这里的问题是双重并不像某些人可能引导你相信的那么精确。在您的代码中,问题依赖于

int NumberOfCoins = (int)NumberOfMoney * 100;

因为这个操作的输出是114.999999999 ...这里有2个选项,你可以使用Math.roundor使用另一种更精确但像BigDecimal一样慢的操作。

如果你想要那个精度你可以使用BigDecimal,但是像Qazxswpoi这样的基本运算符在BigDecimal上不存在,但是你可以使用它们的方法+,-,/*等。

更新1: 代码审查 理想情况下,变量的命名应以小写开头,然后是以下所有单词,即开头的大写字母。例如。

add, multiply, substract应该是NumberOfMoney numberOfMoney应该是NumberOfCoins这些名字可以改进,但目前还可以。

如果你将numberOfCoins除以另一个int,那么最终值将始终是int,没有必要施放它。 例如

int

此操作过于复杂,您可以简单地进行操作

//The following statements are equal
int NumberOfDollars = (int)(NumberOfCoins/100);
int NumberOfDollars = NumberOfCoins / 100;

更新2: 根据您发布的规则,您不遵循规则1,2和3.对于规则1,它要求您隔离String的2个组件。第一个组件是美元值,第二个组件是美分值。

//from
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;

//to
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins % 100;

对于规则2,请查看String amountValue = "1.15"; String dollaralue = "1" // you need to figure out how to do this. String centValue = "15" // same 的文档,特别是parseInt的文档。

对于规则3,这是类型化Integer


1
投票

将你的int NumberOfCoins = (int)(NumberOfMoney * 100);改为int NumberOfCoins = (int)(NumberOfMoney * 100);

正如其他同行提到的那样,在处理货币时不能真正信任双倍和浮动,值得阅读int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));


1
投票

您看到的错误与您未遵循指令3的事实有关,以避免类型转换。

在几个地方你做的事情如下:

Why not use Double or Float to represent currency?

这是铸造,并且在int NumberOfCoins = (int)(NumberOfMoney * 100); int之间施放可能会导致您看到的舍入错误。您可以通过特定方式舍入来解决此问题。

但是,我认为你应该遵循你的第一条指令:

double

然后你将处理整数,并可以更干净地进行计算。

© www.soinside.com 2019 - 2024. All rights reserved.