1

好的,所以一个月前开课了,秋季学期在 3 周后重新开始。我想做我们从未分配过的书中的作业。这个问题让我陷入了困境,因为它在第二章。它是一个回馈零钱的程序(92 美分是编译时初始化)。我的问题是......有什么办法可以让这个程序比它更“愚蠢”。而且我还必须把 (int) 放在我分配的 anQuarter、anDime 等之前。否则我之后会得到小数。这是为什么?有经验的程序员能解释一下吗?

另外,本章谈到了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);
        }
    }
}
4

3 回答 3

7

至少使用小数:.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
于 2013-08-01T22:36:56.063 回答
2

而且我还必须把 (int) 放在我分配的 anQuarter、anDime 等之前。否则我之后会得到小数。这是为什么?有经验的程序员能解释一下吗

(int)表达式中的值转换为整数类型。使用像这样的类型转换是从一种数据类型转换为另一种数据类型的有用方法。在这种情况下,您的计算会产生一个double数据类型。将其转换为int是在不四舍五入的情况下剔除所有小数位的最简单方法。

于 2013-08-01T22:45:06.033 回答
1

一些想法...

我建议decimalover double- with decimal,你会得到精确的十进制表示,这通常是你想要的钱。使用double(或float),您会得到二进制表示,它们并不总是相等的。

你在除法时得到小数的原因是adouble除以adouble会给你double在C#中的a。如果你想得到int,你要么必须像你正在做的那样截断它,要么首先从ints 开始。一个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;
}
于 2013-08-01T22:41:29.910 回答