Задача Calculate Discount

Именно, че 4.72 не е верен отговор, защото с прости сметки няма шанс да стигнеш до него.
Това, че даден метод/финкция би я сметнало и закръглило до 4.72 по дизайн не прави отговора грешен. Презентирането на резултата също е съществена част от писането на код :wink:

Здравейте,

Тъй като и аз се борих известно време с тази задача, а по-горе никой не е споделил как успешно е решил задачата на Javascript (или пък споделените методи не сработиха), пращам линк към обяснение
защо само Math.round не върши работа винаги и при четвъртия тест се чупи (4.725 трябва да се закръгли на 4.73, а не на 4.72): https://www.jacklmoore.com/notes/rounding-in-javascript/

Надявам се да е от помощ за хора, които тепърва ще се сблъскат с този проблем. :slight_smile:

4 Likes

Здравейте!
Тъй като и аз много се мъчих с този проблем със закръглянето до 2 цифри след десетичната точка, точно с JavaScript и най-накрая намерих решение на проблема, с което Judge ми дава 100/100, публикувам кода си. Не съм сигурна дали това работи във всеки един случай, но в конкретния пример е ок.
Източник:[https://stackoverflow.com/questions/1726630/formatting-a-number-with-exactly-two-decimals-in-javascript]

Здравейте,
това върши работа за Judge:
// Input.

let input = [

'4',

'9.99',

'19.99',

'29.99',

'39.99'

];

// Custom implementation of read and print. Do not touch : )

let print = this.print || console.log;

let gets = this.gets || ((arr, index) => () => arr[index++])(input, 0);

// Solution

let numItems = +gets();

function round(value, decimals) {

return Number(Math.round(value+‘e’+decimals)+‘e-’+decimals);

}

for (let i = 1; i<= numItems; i++){

let ItemsPrice = Number(gets());

ItemsPrice = round(ItemsPrice - 0.65* ItemsPrice, 2).toFixed(2);

print(ItemsPrice)

}

Здравейте ,
това е моето решение https://pastebin.com/GC1eFk1X , със сигурност има и по-добри , но това измъдрих аз :grinning:

this passes all tests

let numberOfItems = +gets();
let itemPrice = [];
for (let i = 0; i < numberOfItems; i++) {
itemPrice[i] = +gets();
print((Math.round(((itemPrice[i] * 0.35) * 1000)/10)/100).toFixed(2));
}

Много хитри решения има описани в тази дискусия. Може би идеята на задачата, обаче, не е била да се ползва exponent notation, Intl.NumberFormat, закръгляне на частта след десетичната запетая и други трикове.

Редът на изпълнение на операциите умножение и деление в JavaScript има значение за крайния резултат (заради начина на представяне на дробни числа в паметта). Ако първо умножим, а после делим, получаваме едно число, а ако първо делим и после умножим, друго.

В описания по-горе примерен input 13.5 и очакван output 4.73, се получава следната разлика при разменяне на операциите:

print(13.5 / 100 * 35); // 4.7250000000000005
print((13.5 / 100 * 35).toFixed(2)); // 4.73
print(13.5 * 35 / 100); // 4.725
print((13.5 * 35 / 100).toFixed(2)); // 4.72
1 Like