11. Рожден ден (Programming Basics)
Здравейте,
Пробвах се да реша бонус задачата към Прости пресмятания на програминг бейсикс, но получавам само 80/100. Колкото и да изменям кода все до там стигам. Ето го моя код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Birthday
{
class Program
{
static void Main(string[] args)
{
var l = int.Parse(Console.ReadLine());
var w = int.Parse(Console.ReadLine());
var h = int.Parse(Console.ReadLine());
var percent = double.Parse(Console.ReadLine());
var TotalVolume = l * w * h;
var RealLitres = TotalVolume * 0.001;
var procent = percent * 0.01;
var FinalVolume = RealLitres * (1 - procent);
Console.WriteLine(Math.Round(FinalVolume, 3));
}
}
}
Ако някой има идеи ще бъда много благодарен :)
math,round e математическа операция и при число примерно 1.4325 ще ти върне 1.433 на конзолата
а {x:f3} е графично изписване и ще ти върне 1.432 просто ще отреже символите след 3 тия знак, и затова се получават разликите.
Пълни глупости. Я пусни тоя код да видиш какво излиза на конзолата
И преди сме се сблъсквали по теми в форума. НО тоя път fuck off. Може да си ок с математиката и с++ но тук .... На работа съм затова ето : ето ти го и като линк бтв в къщи на компилатора ще е същото в VS
https://imgur.com/a/KfkHLNp eто го и като линк... при 5 винаги ще е различно по различен начин работят {f:x} и math.round(f,x);
и да объркал съм малко кое накъде тръгва...но тея неща така или иначе не се помнят на изуст.
Аз до колкото знам, Math.Round, ако не му се зададе MidpointRounding.AwayFromZero, си закръгля ToEven(банкерско), към четното число примерно:
1.4325 => 1.432
1.4335 => 1.434
докато форматирането с :F2, :F3 и т.н винаги ако е по средата т.е. на 5 закръгля нагоре.
другата разлика между двете е че Math.Round реже нулите накрая, а другото оставя толкова символа колкото е казано
пример:
Math.Round(1.43000, 3) => 1.43
${1.43000:F3} => 1.430
демек, ако искаш да е по точно определен начин е хубаво да си му го зададеш като трети параметър с MidpointRounding
така като гледам май не идва от Math.Round а то типа който му се подава
Ами очевидно Round() има проблем със закръгляването на числа от тип double. А да се използва decimal навсякъде вместо double е просто абсурдно.
Проблема всъщност възниква от неточното представяне на числата с плаваща запетая в двоичен вид както и от алгоритъма който се използва от Round() за закръгляването.