如何使更改计算器更简单

时间:2013-08-01 22:32:29

标签: c#

好的,所以课程在一个月前退出,秋季学期开始在3周内恢复。我想在书中做我们从未分配的作业。这个问题让我陷入困境,因为它在第二章中。它是一个给予改变的程序(92美分是编译时初始化)。 我的问题是......有没有什么方法可以使这个程序更“虚拟”而不是它。 而且我还必须把(int)放在我对aQuarter,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);
        }
    }
}

3 个答案:

答案 0 :(得分:7)

至少使用十进制:Difference between decimal, float and double in .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

答案 1 :(得分:2)

  

而且我必须把(int)放在我分配anQuarter,anDime等的前面。否则我之后会得到小数。这是为什么?经验丰富的程序员可以解释

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

答案 2 :(得分:1)

一些想法......

我建议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;
}