powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Значение слишком мало или слишком велико для decimal - как бороться?
25 сообщений из 56, страница 2 из 3
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903003
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?
Потому что, если эта сумма будет суммироваться из множества рублевых с копейками сумм, у вас может получиться разброс в итоговой сумме - в большую или меньшую сторону. Ибо double точности НЕ ГАРАНТИРУЕТ!
Не надо так с горячя. гарантирует, но в определённых пределах. так же как и децимал. пределы у каждого свои.
Дополню ответ позже.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903011
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДостаточно привести один пример.

Пожалуйста:
Код: c#
1.
2.
3.
4.
5.
double a = 3.65, b = 0.05, c = 3.7;
Console.WriteLine("3.65 + 0.005 = 3.7 - is it correct if use double? {0}", (a + b) == c);
decimal x = 3.65m, y = 0.05m, z = 3.7m;
Console.WriteLine("3.65 + 0.005 = 3.7 - is it correct if use decimal? {0}", (x + y) == z);            
Console.ReadLine();
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903017
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Надо не спорить, а скорее исправлять где там у себя накосячили пока не обнаружилось
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903024
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся немного с запятыми выше:
Код: c#
1.
2.
3.
4.
5.
double a = 3.65, b = 0.05, c = 3.7;
Console.WriteLine("3.65 + 0.05 = 3.7 - is it correct if use double? {0} {1}", (a + b) == c, (a + b));
decimal x = 3.65m, y = 0.05m, z = 3.7m;
Console.WriteLine("3.65 + 0.05 = 3.7 - is it correct if use decimal? {0} {1}", (x + y) == z, (x + y));
Console.ReadLine();
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903025
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?
Потому что, если эта сумма будет суммироваться из множества рублевых с копейками сумм, у вас может получиться разброс в итоговой сумме - в большую или меньшую сторону.
А может проблема в суммировании а не в хранении как double? Как вы пришли к выводу что дабл проблема а не операция сложения?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903029
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronКак вы пришли к выводу что дабл проблема а не операция сложения?
Я где-то разве говорил выше, что приходил к выводу, что double - проблема?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903030
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.PromikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?у тебя есть рулетка на 1 метр. Ты можешь отмерить ей километр (допустим, точность твоих рук позволяет это сделать)

А теперь представь, что у тебя немножко косячная рулетка, и длиной она 99,5 см

Сколько будет "разбег", когда ты отмеришь ей километр? А 10 километров? то-то.
Деньги такого не терпят
Если мне известа кривизна рулетки, то и километр я отмерю так-же точно. Но пример неудачный.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903031
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronТаким образом если мы согласимся принятъ погрешность приведения то и на этапе сравнения нужно это учитывать. Проблем нет. Это не коим образом не ограничивает приминение доубле.то есть мы ради использования double откажемся от операции прямого сравнения. Будем всегда сравнивать с заданной точностью. Иначе получится как в приведенном мной экселевском файле (а именно это я и привел) - прямое сравнение двух вроде бы одинаковых чисел дает ЛОЖЬ.

еще раз - применение неточных типов допустимо только в расчетах с допустимой погрешностью. В финансовых расчетах погрешность недопустима, так как там не используются неточные величины.


AxeleronНадо не спорить, а скорее исправлять где там у себя накосячили пока не обнаружилось вишь, старшие товариши и множество статей ему не указ. Пока сам шею не свернет - будет стоять на своем
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903036
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleronmikron,

Надо не спорить, а скорее исправлять где там у себя накосячили пока не обнаружилось
Я не враг себе, следовать таким советам: меня уволят и будут правы. Но отношения к дискуссии это не имеет.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903038
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronменя уволят и будут правы.
Чо, так быстро уже?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903044
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronОшибся немного с запятыми выше:
Код: c#
1.
2.
3.
4.
5.
double a = 3.65, b = 0.05, c = 3.7;
Console.WriteLine("3.65 + 0.05 = 3.7 - is it correct if use double? {0} {1}", (a + b) == c, (a + b));
decimal x = 3.65m, y = 0.05m, z = 3.7m;
Console.WriteLine("3.65 + 0.05 = 3.7 - is it correct if use decimal? {0} {1}", (x + y) == z, (x + y));
Console.ReadLine();


Я уже ответил на похожий пример. Вы исключаете из рассмотрения операции приведения, сложения и сравнения и приходите к выводу что виноват во всём дабл. Может просто такое обращение с даблом недопустимо?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903048
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЯ уже ответил на похожий пример. Вы исключаете из рассмотрения операции приведения, сложения и сравнения и приходите к выводу что виноват во всём дабл. Может просто такое обращение с даблом недопустимо?
Давайте лучше Вы покажите почему в моем примере сложенное выражение двух double не равно ожидаемому? И какое обращение с даблом допустимо с Вашей точки зрения?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903053
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.PromikronТаким образом если мы согласимся принятъ погрешность приведения то и на этапе сравнения нужно это учитывать. Проблем нет. Это не коим образом не ограничивает приминение доубле.то есть мы ради использования double откажемся от операции прямого сравнения. Будем всегда сравнивать с заданной точностью. Иначе получится как в приведенном мной экселевском файле (а именно это я и привел) - прямое сравнение двух вроде бы одинаковых чисел дает ЛОЖЬ.

еще раз - применение неточных типов допустимо только в расчетах с допустимой погрешностью. В финансовых расчетах погрешность недопустима, так как там не используются неточные величины.

А разве правило, при работе с дабл всегда учитывать точность представления, не входит самые азы обучения программированию? Сравнивать дабл на равенство это вобще моветон и редко допустимо. Но на этом я уже не заостряюсь сдесь. Почему вы исключили операцию сложения хочу спросить? Я бы сказал что и складывать так нельзя, если речь идёт о деньгах. А вот на ограничения использование дабла никак не сказывается.
И пересмотрите на досуге ваши убеждения, они силь смахивают на веру неподкреплённую фундаментальными знаниями.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903057
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИ пересмотрите на досуге ваши убеждения, они силь смахивают на веру неподкреплённую фундаментальными знаниями.
А Вы изучали в университете в чем разница между числами с плавающей и фиксированной точкой(запятой)?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903093
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИ пересмотрите на досуге ваши убеждения, они силь смахивают на веру неподкреплённую фундаментальными знаниями.Веры тут нет, знаний у меня достаточно, я писал, в том числе, на ассемблере. И я по этим граблям уже ходил. Удачи.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903105
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronЯ уже ответил на похожий пример. Вы исключаете из рассмотрения операции приведения, сложения и сравнения и приходите к выводу что виноват во всём дабл. Может просто такое обращение с даблом недопустимо?
Давайте лучше Вы покажите почему в моем примере сложенное выражение двух double не равно ожидаемому? И какое обращение с даблом допустимо с Вашей точки зрения?
Взгляните со стороны: бы утверждаете, что использование дабла недопустимо, обосновать утверждение не можете, приводите странный пример, и предлагаете мне, показать почему пример не отвечает вашему ожиданию? Я не знаю почему это должно быть лучше и лучше чего, но это был ваш выбор - получите: ошибка в вашем ожидании. Оно просто ошибочно и не обоснованно.
Предположим вы хотели спросить: как сложить два дабл числа представляющих цену(amount). Ответ: накопленный результат округлят до точности представления цены и избегать накопление погрешности но единицы измерения.
Если вы хотели спросить как сравнить два дабла: только с учётом погрешности.
И эти правила также действительны при работе с децимал.

Ну и ещё в догонку: децимал тоже floating point.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903121
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.PromikronИ пересмотрите на досуге ваши убеждения, они силь смахивают на веру неподкреплённую фундаментальными знаниями.Веры тут нет, знаний у меня достаточно, я писал, в том числе, на ассемблере. И я по этим граблям уже ходил. Удачи.
Давайте не будем тут мерятся, а то получится как в анекдоте.
Вернёмся к теме: Ваше утверждение о непременимости дабле для финансовых вычислений получит подтверждение или останется голословным?
Я считаю использование дабла в приведённом примере верным и могу это обосновать: возведение в степень для децимала.
Кроме этого обоснования есть ещё очень важный аргумент: скорость вычислений. А вот тот, кто взялся править код у меня вызывает подозрения: он даже не смог самостоятельно справится с ошибкой привидения.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903311
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortisAxeleron, не, он сам ушёл. Говорит, алгоритм брал отсюда

http://blogs.msdn.com/b/lucabol/archive/2007/12/17/bisection-based-xirr-implementation-in-c.aspx

Это понятно что double нельзя. Но что-то надо делать с этим.Забавно, там же:

Код: c#
1.
2.
3.
4.
5.
6.
using Money = System.Decimal;
using Rate = System.Double;

public static class Algorithms {

    internal static Money CalculateXNPV(IEnumerable<CashFlow> cfs, Rate r)


То есть Ваш метод Calculate должен возвращать Decimal .
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903313
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron, почитайте: Что нужно знать про арифметику с плавающей запятой , - думаю Вам будет полезно.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903444
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAmikron, почитайте: Что нужно знать про арифметику с плавающей запятой , - думаю Вам будет полезно.
Я не понял ваш поинт. Вы хотели привисти аргумент в пользу какого-то утверждения?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903505
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Double для финансовых расчетов не совсем подходит, это точно.

Если decimal слишком мал для вас, используйте BigInteger
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903563
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Если decimal слишком мал
откуда столько денег ?
может просто ошибку в другом месте искать следует?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903591
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79Если decimal слишком мал
откуда столько денег ?
может просто ошибку в другом месте искать следует?
А что вы мне адресуете вопрос? :-) Я вот не знаю, может ТС считает вклад с капитализацией процентов в зимбабвийских долларах. Там и decimal может быть мал :-)
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903592
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилArm79Если decimal слишком мал
откуда столько денег ?
может просто ошибку в другом месте искать следует?
А что вы мне адресуете вопрос? :-) Я вот не знаю, может ТС считает вклад с капитализацией процентов в зимбабвийских долларах. Там и decimal может быть мал :-)
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903595
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто удобнее работать с очень малыми дробными числами в double и очень большими в децемал
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Значение слишком мало или слишком велико для decimal - как бороться?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]