如何使零钱计算器更简单

本文关键字:更简单 计算器 何使零 | 更新日期: 2023-09-27 18:25:49

好吧,一个月前就开始上课了,秋季学期将在3周后重新开始。我想做书上从未分配给我们的作业。这一个问题让我陷入困境,因为它在第二章。它是一个返回更改的程序(92美分是编译时初始化)。我的问题是…有没有办法让这个节目比现在更"愚蠢"。此外,我还必须把(int)放在我的作业前面,说明四分之一、二分之一等是什么。否则我会得到小数。为什么?有经验的程序员能解释吗?

此外,本章讨论了MOD,这就是我使用它的原因。这是在引入调用类方法之前,显然是在循环和数组之前。所以我不能用这些工具。应该只是一个非常基本的"洞穴人"程序。。。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication273
{
    class Program
    {
        static void Main(string[] args)
        {
        double change = 0.92;
        double quarter = 0.25;
        double dime = 0.10;
        double nickel = 0.05;
        double pennies = 0.01;
        double anQuarter = (int)(change / quarter);
        double anDime = (int)((change % quarter) / dime);
        double anNickel = (int)(((change % quarter) % dime) / nickel);
        double anPennies = (int)((((change % quarter) % dime) % nickel) / pennies);
        Console.WriteLine("The amount of quarters are....{0}", anQuarter);
        Console.WriteLine("The amount of dimes are....{0}", anDime);
        Console.WriteLine("The amount of nickels are....{0}", anNickel);
        Console.WriteLine("The amount of pennies are....{0}", anPennies);
        }
    }
}

如何使零钱计算器更简单

至少使用十进制:.NET中的十进制、浮点和双精度之间的区别?

然后删除重复代码:继续观看http://ideone.com/ZY9qBm

using System;
class Program
{
    static void Main()
    {
        decimal change    = 0.92m;
        var coins = new [] { // ordered
            new { name = "quarter", nominal   = 0.25m }, 
            new { name = "dime", nominal      = 0.10m },
            new { name = "nickel", nominal    = 0.05m },
            new { name = "pennies", nominal   = 0.01m }
        };
        foreach (var coin in coins)
        {
            int count = (int) (change / coin.nominal);
            change -= count * coin.nominal;
            Console.WriteLine("{0} {1}", count, coin.name);
        }
    }
}

打印

3 quarter
1 dime
1 nickel
2 pennies

此外,我还必须把(int)放在我的作业前面,说明四分之一、二分之一等是什么。否则我会得到小数。为什么?有经验的程序员能解释吗

(int)正在将表达式中的值转换为整数类型。像这样使用类型转换是将一种数据类型转换为另一种数据的有用方法。在这种情况下,您的计算结果是double数据类型。将其转换为int是去掉所有十进制数字而不取整的最简单方法。

一些想法。。。

我推荐decimal而不是double——使用decimal,你可以得到精确的十进制表示,这通常是你想要的钱。使用double(或float),可以得到二进制表示,但它们并不总是相等的。

当你除法时得到小数的原因是double除以double会得到C#中的double。如果你想得到int,你要么像现在这样截断它,要么从int开始。int除以int得到int

为了让整件事更简单,你可以把所有的东西都当作整数美分,比如:

int change = 92;
int quarter = 25;
int dime = 10;
int nickel = 5;
int pennies = 1;
int anQuarter = change / quarter;
int anDime = ((change % quarter) / dime);
int anNickel = (((change % quarter) % dime) / nickel);
int anPennies = ((((change % quarter) % dime) % nickel) / pennies);

不过,为了可读性,您可以用很多不同的方法来实现。一种方法(可能不是最好的方法)是不断减少欠款,直到你达到零。

int anQuarter = 0, anDime = 0, anNickel = 0, anPennies = 0;
while (change >= 25)
{
    anQuarter++;
    change -= 25;
}
while (change >= 10)
{
    anDime++;
    change -= 10;
}
while (change >= 5)
{
    anNickel++;
    change -= 5;
}
while (change >= 1)
{
    anPennies++;
    change -= 1;
}