Код для подсчета суммы валюты кажется странным. (Непреднамеренные десятичные знаки продолжают появляться) - PullRequest
0 голосов
/ 14 апреля 2020

Я только начинаю изучать C# через CodeAcademy. Я должен написать программу для расчета наименьшего количества «монет» различных значений, необходимых для достижения указанной суммы. Все пошло хорошо, следуя инструкциям, но в конце упражнения вам предлагается написать еще немного кода, чтобы программа работала с десятичными входами (вместо целых чисел).

Я, по сути, скопировал тот же код, который использовался для полных сумм, с небольшими изменениями (умножив начальную сумму на 100), чтобы он все еще мог работать и давать требуемые результаты. Однако последнее значение (бронзовые центы) почему-то продолжает давать мне цифры с десятичными знаками . Я думал об использовании Math.Floor (), но после нескольких испытаний я понял, что это не всегда избыток. Кто-нибудь может помочь? Есть ли какие-то внутренние ограничения для команды Math.Floor (), о которых я должен был знать? Я только что сделал большую глупость?

tl; dr: noob кодер, интересно, почему код не делает то, что я хочу, чтобы он делал

using System;

namespace MoneyMaker
 {
class MainClass
{
public static void Main(string[] args)
{
  // This code is meant to divide an (user given) amount of money into coins of different values.

  // First we ask for an input.
  Console.WriteLine("Welcome to Money Maker!.00");
  Console.WriteLine("Please enter the amount you want to divide in Coins:");
  string strAmount = Console.ReadLine();
  Console.WriteLine($"${strAmount} Canopy is equal to:");
  double wholeAmount = Convert.ToDouble(strAmount);

  // These are the values of each coin.
  // The cents are multiplied by 100 for the purposes of using then in the code.
  // The bronze coins are listed, but unused, since their value is essentially 1.
  double gold = 10;
  double silver = 5;
  //double bronze = 1;
  double smolGold = .1 * 100;
  double smolSilver = .05 * 100;
  //double smolBronze = .01 * 100;

  // These lines calculate the integral values (gold, silver and bronze coins).
  double douAmount = Math.Floor(wholeAmount);
  double goldCoins = Math.Floor(douAmount / gold);
  double silAmount = douAmount % gold;
  double silverCoins = Math.Floor(silAmount / silver);
  double bronzeCoins = silAmount % silver;

  // These lines calculate the decimal values (gold, silver and bronze cents).
  // They start by multiplying the cents by 100, rendering the rest of the lines the same as in the integral values.
  double smolAmount = 100 * (wholeAmount - douAmount);
  double goldCents = Math.Floor(smolAmount / smolGold);
  double littleSilver = smolAmount % smolGold;
  double silverCents = Math.Floor(littleSilver / smolSilver);
  //ERROR: There seems to be an issue with the bronze cents, returning a value with decimals.
  double bronzeCents = littleSilver % smolSilver;

  // Finally, the output string with the results:
  Console.WriteLine($"\n Gold Coins: {goldCoins} \n Silver Coins: {silverCoins} \n Bronze Coins: {bronzeCoins} \n Gold Cents: {goldCents} \n Silver Cents: {silverCents} \n Bronze Cents: {bronzeCents}");
}

}}

1 Ответ

2 голосов
/ 14 апреля 2020

Никогда не используйте двойные числа для валюты . Используйте decimal.

Используйте double при представлении физической величины , такой как длина, масса, скорость и т. Д., Где незначительные ошибки представления не имеют значения. Используйте decimal для представления денег , где важен каждый пенни или дробь копейки.

Разница: double представляет числа как дробь, в которой знаменатель представляет собой степень двух как "5/32nd". decimal представляет числа в виде дроби, в которой знаменатель представляет собой степень десяти, например «3/100-е». Первый будет иметь тенденцию накапливать ошибки представления для дробей, таких как «3/100-е», но второй не будет.

Если в вашем руководстве предлагается использовать double арифмети c для вычислений с участием денег, получите лучший учебник .

Все это говорит, я подозреваю, что вы можете неправильно понять, для чего предназначен оператор %, если вы используете его в нецелых количествах. Он предназначен в основном для целочисленных величин, поэтому, если вы используете его в десятичных или двойных числах, возможно, происходит что-то странное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...