05. Trapeziod Area [Programming Basics with JavaScript - юни 2018]
function trapeziodArea(input) {
let b1 = input[0];
let b2 = input[1];
let h = input[2];
let result = (b1 + b2) * h/2;
console.log(result);
}
trapeziodArea([4, 6, 8]);
judge системата ми изкарва грешка на задачата. Можете ли да ми кажете къде бъркам?
При пускането на програмата в WebStorm резултата си е 40 но judge ми изкарва, че резултата ми е 184 О_о.
Мда. След малка разходка и аз стигнах до тоя извод :)
Благодаря много за отговора .
Здравейте всички, в момента решавам примерчетата от javascript basics - а от лятото, и точно с тази задача не мога да взема 100/100. Пробвах всичко, но стигам до 80/100, защото при единия input от judge при мен се получава това: 6.845000000000001, а трябва да е 6.845. Рових се как да го оправя, но намирам разни твърде сложни решения за такова просто нещо. Знам че скоро стартира нова група с javascript, но не ми се чака заради един пример :)
Буквално с всеки един код написан тук получавам 80/100
Привет,
Пробва ли да ограничиш броя на символите с toFixed(3) Method, ако проблема е в символите разбира се?
https://www.w3schools.com/jsref/jsref_tofixed.asp
Ивайло
Да, но това дава още повече грешки, тъй като някои от тестовете в judge изискват резултата да е с 2 или никакви знаци след десетичната точка.
Здравей,
моя съвет в такива случай, е за да избегнеш проблема със закръглянето да махаш последната цифра (с toFixed), и после да махаш trailing zero(например чрез parseFloat). Понеже мисля, че прецизността е 16 цифри, оставяме 1 за целите числа, от останалите 15 взимаме 14 с toFixed(14).
function trapeziodArea(input) {
let a = Number (input[0])
let b = Number (input[1])
let h = Number (input[2])
let area = ((a+b)*h)/2
console.log(parseFloat(area.toFixed(14)))
}
Наистина.... 100/100. Любопитно ми е как ще го направят в js basics-a който стартира сега. Благодаря, запазвам си го.:)
Пробравай с .toFixed(3) като да знаеш че този метод ти връща String.
Пробвах, но не става, защото някои от тестовете в judge имат резултат без нищо след десетичната точка, и toFixed тогава пречи, добавяйки такива(нули).
дай линк към задачата
Ето тук, 6-та задача:
https://softuni.bg/trainings/resources/officedocument/31815/exercise-problem-descriptions-programming-basics-with-javascript-june-2018/1994
function solve(input) {
let b1 = Number(input[0]);
let b2 = Number(input[1]);
let h = Number(input[2]);
let side = ((b1 + b2) * h).toFixed(2);
let area = Number((side / 2));
console.log(area);
}
Сега трябва да стане. В JavaScript делението е малко шантаво и понякога хвърля такива небивалици както в конкретния случай, за това фиксираш преди да делиш за да може да ти искара точен резултат.
Не само в JavaScript (ами във всички езици, които са имплементирали стандарта IEEE-754 64-битови реални числа с двойна прецизност или по-известни като double) има проблеми с дробните, точни са само 1/2, 1/4, 1/8, ... но при 1/10, 1/100 ... има проблеми понеже се ползва закръгляне. Затова дори 0.1 не е точно, и може да имате проблеми не само при делене. Например пробвайте, че 0.1 + 0.2 === 0.3 връща false. Но като се познава проблема се избягва, например ако се работи с пари, се умножават по 100, работи се само с цели числа, и накрая само се дели на 100 и .toFixed(2). При сметки с лица и обеми също може да ползваме, че .toFixed(n) фиксира с точност до n-знак, а parseFloat(x) пък премахва trailing zeroes.