Возврат изменений с использованием только условных выражений JavaScript - PullRequest
0 голосов
/ 22 декабря 2018

Попытка написать программу, которая возвращает точное изменение монет, которые используют монеты: [1, 0,50, 0,20, 0,10, 0,05, 0,02, 0,01].Я пытаюсь сделать это, используя только условные выражения.Моя проблема в том, что последнее выражение «IF» не работает так, как я хочу, и я не понимаю, что не так.

Например, для текущего числа результат должен быть [1 x 0,20 и 2х 0,02].вместо этого он возвращает меня [1 x 0,20 и 1 x 0,02 и 1 x 0,01]

var price = 0.76;
var paid = 1;

var a = paid - price;

var oneLeva = 0;
var fiftyCents = 0;
var twentyCents = 0;
var tenCents = 0;
var fiveCents = 0;
var twoCents = 0;
var oneCents = 0;

if((a - 1) >= 0){
  oneLeva += 1;
  a -= 1;
  if((a - 1) >= 0){
    oneLeva += 1;
    a -= 1;
    if((a - 1) >= 0){
      oneLeva += 1;
      a -= 1;
      if((a - 1) >= 0){
        oneLeva += 1;
        a -= 1;
      }  
    }  
  }  
}

if((a - 0.50) >= 0){
  fiftyCents += 1;
  a -= 0.50; 
}

if((a - 0.20) >= 0){
  twentyCents += 1;
  a -= 0.20;
  if((a - 0.20) >= 0){
    twentyCents += 1;
    a -= 0.20; 
  }  
}

if((a - 0.10) >= 0){
  tenCents += 1;
  a -= 0.10; 
}

if((a - 0.05) >= 0){
  fiveCents += 1;
  a -= 0.05;  
}

if((a - 0.02) >= 0){
  twoCents += 1;  
  a -= 0.02;  
  if((a - 0.02) >= 0){
    twoCents += 1;    
    a -= 0.02; 
  }
}

if((a - 0.01) > 0){
  oneCents += 1;
  a -= 0.01;  
}


console.log(oneLeva);
console.log(fiftyCents);
console.log(twentyCents);
console.log(tenCents);
console.log(fiveCents);
console.log(twoCents);
console.log(oneCents);

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

JS, как и многие другие языки программирования, плохо работает с числами с плавающей запятой.Обходной путь достаточно прост: просто умножьте все свои числа на 100 или 1000 и т. Д., Пока не будет плавающей запятой, затем выполните вычисления, а затем разделите результат на 100 или 1000 и т. Д.

0 голосов
/ 22 декабря 2018

Добро пожаловать в математику в JavaScript!

Хорошо, значит, когда вы делаете 0.24 - 0.2, результат НЕ 0.04.Вместо этого это 0.03999999999999998.Затем вы вычитаете 0.02 из того, что дает 0.01999999999999998, что меньше 2, поэтому операторы if портятся, и ваш код дает неожиданный результат.

Причина в том, чтопотому что JavaScript не хранит числа с плавающей запятой, как многие ожидали бы, то есть теряет точность.

Вы можете увидеть это в действии, выполнив console.log(a) на каждом шаге своего кода.

Я высоко ценюПредлагаем вам взглянуть на этот пост , который охватывает именно проблему, с которой вы столкнулись.Есть несколько решений, которые будут работать для вас.

w3schools также есть несколько хороших примеров .

Веселитесь!

...