C# 带If条件的While循环导致意外的无限循环

C# 带If条件的While循环导致意外的无限循环,c#,if-statement,while-loop,C#,If Statement,While Loop,我正在重温我的一个旧练习,我的逻辑似乎有问题。这是一个简单的控制台应用程序,用于计算和显示给定总额和投标现金的变化。出于某种原因,当我输入的值的小数部分不是25时,我得到了一个无限循环 这是我的控制台应用程序的屏幕截图 这是我的密码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace James_Archbold_A2 { class Progr

我正在重温我的一个旧练习,我的逻辑似乎有问题。这是一个简单的控制台应用程序,用于计算和显示给定总额和投标现金的变化。出于某种原因,当我输入的值的小数部分不是25时,我得到了一个无限循环

这是我的控制台应用程序的屏幕截图

这是我的密码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace James_Archbold_A2
{
    class Program
    {
        static void Main(string[] args)
        {
            double change,total,cash;
            int  fifties = 0, twenties = 0, tens = 0, fives = 0, ones = 0,
                quarters = 0, dimes = 0, nickels = 0, pennies = 0;

            Console.Write("Please enter the total: ");
            total = Convert.ToDouble(Console.ReadLine());

            Console.Write("Please enter the cash tendered: ");
            cash = Convert.ToDouble((Console.ReadLine()));

            change = CalculateChange(total, cash);
            Console.WriteLine(change);

            change *= 100;


            while (change > 0)
            {


                if (change >= 5000)
                {
                    change -= 5000;
                    fifties++;
                    Console.WriteLine(change);


                }

                else if (change >= 2000)
                {
                    change -=2000;
                    twenties++;
                    Console.WriteLine(change);

                }

                else if (change >= 1000)
                {
                    change -=1000;
                    tens++;
                    Console.WriteLine(change);

                }

                else if (change >= 500)
                {
                    change -= 500;
                    fives++;
                    Console.WriteLine(change);
                }

                else if (change >= 100)
                {
                    change -=100;
                    ones++;
                    Console.WriteLine(change);

                }

                else if (change >= 25)
                {
                    change -=25;
                    quarters++;
                    Console.WriteLine(change);

                }

                else if (change >= 10)
                { 
                    change -=10;
                    dimes++;
                    Console.WriteLine(change);
                }

                else if (change >= 5)
                {
                    change -=5;
                    nickels++;
                    Console.WriteLine(change);

                }

                else if (change >= 1)
                {
                    change -=1;
                    pennies++;
                    Console.WriteLine(change);
                }
            }

            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("Total: {0:c}\nCash Tendered: {1:c}" +
                            "\nChange Due: \nFifties: {2}\nTwenties: {3}\nTens: {4}" +
                              "\nFives: {5}\nOnes: {6}\nQuarters: {7}\nDimes: {8}" +
                              "\nNickels: {9}\nPennies: {10}",
                              total, cash, fifties, twenties, tens, fives, ones, quarters, dimes,nickels, pennies);
            Console.WriteLine(sb);
            Console.ReadLine();
        }

        static double CalculateChange(double total, double cash)
        {
            return cash - total;
        }
    }
}

在while条件中使用change>=0,将change设置为int,以截断.0000000000001,以防止当前算法中的更改降至0以下:

int change = CalculateChange(total, cash) * 100;

如果要编写与财务计算相关的内容,请使用decimal数据类型。不是双重的

我认为Jon Skeet的文章会给你最大的洞察力

其他几点建议:


您的算术使用了双精度


如果要使用带小数点的浮点,则应使用C类型。

在提供的代码段中,将变量更改的值四舍五入到最接近的整数,即可获得所需的输出


希望这有助于检查您的if条件m while条件不确定您是否是否决我的问题的人,但更改条件不会更改循环的结果。请使用Math.floor对while条件中的更改进行取整,因为您使用的是double it takes.000000000001作为建议,不要在金融交易中使用double它解决了大多数问题。非常感谢你。
`while (change > 0)`
`while(Math.Round(change)>0)`