01. Array Statistics
Някой може ли да кажа защо ми дава 60/100. Два Runtime error-a. Моля само Java-ри, на C# минават решенията.
Задача: https://judge.softuni.bg/Contests/Practice/Index/581#0
Решение: https://pastebin.com/u4309jsK
Някой може ли да кажа защо ми дава 60/100. Два Runtime error-a. Моля само Java-ри, на C# минават решенията.
Задача: https://judge.softuni.bg/Contests/Practice/Index/581#0
Решение: https://pastebin.com/u4309jsK
Здравей,
така и не можах да докарам 100%...
Пробвай с вход: 0 0 1
Два-та Runtime error-a, които виждаш са заради:
BigDecimal averageBig = new BigDecimal(sumBig).divide(new BigDecimal(input.length));
Ако го смениш с:
BigDecimal averageBig = new BigDecimal(sumBig).divide(new BigDecimal(input.length), MathContext.DECIMAL128);
(Runtime error) бива заменен от: (Incorrect answer) :))) Може би, проблемът е в броя знаци след запетаята.
https://stackoverflow.com/questions/4591206/arithmeticexception-non-terminating-decimal-expansion-no-exact-representable
Проблемът явно е при закръглянето на average. И на мен ми дава 60/100 и какво ли не пробвах. Няма в условието до какво число се закръгля и явно деленето дава различни резултати тъй като double не е точен тип и се получават разминавания в двата езика C# и Java. Грешката не е принас а при тези, които са писали задачата и не тестват на различните езици да видят какви резултати се получават ами са я пуснали ей така! Това не ми се случва за първи път!
Ето работещо Java решение (може да фейлне за време на някой тест, ако Judge е натоварен).
Както правилно сте се досетили, проблемът е в закръглянето на числата, което се различава при C# и Java.
Тук съм описал по-подробно проблема и съм дал решение - метод, който се грижи за "правилното" обръщане на double към стринг.
Как изполвайки, по-горе описания метод, да получим C# like double, с примера от по-горе?
Вход 0 0 1 и в крайна сметка: double d = 1d / 3d; expected result: 0.33333333333333331
Тук добре е описано, защо завършваме с: ....1:
https://stackoverflow.com/questions/15330988/double-vs-decimal-rounding-in-c-sharp
Благодаря!
1d / 3 (или 1d / 3d) в C# се отпечатва в конзолата като 0.333333333333333 - тест
В Java същата операция се отпечатва в конзолата с един знак повече (16 вместо 15 знака след десетичната запетая): 0.3333333333333333 - тест
doubleToStringCSharpLike метода, който съм дал по-горе, се грижи при такива входни данни (и не само) да получим стринг, който да е идентичен със стринга, който връща C#.
Как да си сложа мишката на променлива в дебъг, оттук нататък? :)
Благодаря!