powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Значение слишком мало или слишком велико для decimal - как бороться?
25 сообщений из 56, страница 1 из 3
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902652
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет

Double загоняем в decimal (Algorithms.Calculate() возвращает double):

Код: c#
1.
double Value = Math.Round(100 * (decimal)Algorithms.Calculate(CashFlows, 0.00001, 1000), 3);



Иногда сваливается ошибка:

Значение слишком мало или слишком велико для decimal.

Подскажите плз как бороться с этим? Результат, то есть Value должно быть строго double (возвращаемое значение функции).
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902678
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю, само значение Value не превышает 100, а ошибка пишет как будто там запредельное число.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902695
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortis, зачем здесь приведение к decimal?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902723
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile, дело в том, что этот алгоритм Algorithms.Calculate() делал наш товарищ который уволился, это расчёт стоимости, и он везде использовал double, а возвращать мы должны decimal согласно wsdl. Это уже стоит у клиента. Переделка Algorithms.Calculate() чтобы там использовался decimal будет означать что придётся заново тестировать весь алгоритм. Вот я и ищу безопасный способ преобразования double к decimal.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902736
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortis,

Не зря Ваш товарищ уволился (был уволен?). Double нельзя использовать для стоимости.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902762
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Axeleron, не, он сам ушёл. Говорит, алгоритм брал отсюда

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

Это понятно что double нельзя. Но что-то надо делать с этим.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902783
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortisНе знаю, само значение Value не превышает 100, а ошибка пишет как будто там запредельное число.

Нужно смотреть не на значение Value, а на входные параметры и на значение Double, который возвращает метод при эксепшене.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902788
rigorMortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris, да вот что-то не воспроизводится.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902864
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigorMortis,

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

Не зря Ваш товарищ уволился (был уволен?). Double нельзя использовать для стоимости.
Из каких соображений - нелзя? Вера, законадельство или воспитание запрещает?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902913
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronИз каких соображений - нелзя?

Из-за особенностей хранения double в памяти. Если ты видишь на экране 42,13, а на самом деле там 42,1299999876, то на операциях эта разница будет выражаться в копейках и рублях, а это уже - ответственность
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902921
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronAxeleronrigorMortis,

Не зря Ваш товарищ уволился (был уволен?). Double нельзя использовать для стоимости.
Из каких соображений - нелзя? Вера, законадельство или воспитание запрещает?
Учить матчасть
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902944
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarismikronИз каких соображений - нелзя?

Из-за особенностей хранения double в памяти. Если ты видишь на экране 42,13, а на самом деле там 42,1299999876, то на операциях эта разница будет выражаться в копейках и рублях, а это уже - ответственность

Почему нелзя то я так и не понял из примера.
Мне всё равно как оно там внутри на самом деле представлено. Пусть в двоичном коде, електронным зарядом или магнитнитизацией. Если на экране или в отчёте 42,13 то осталное вроде как значения не имеет. Где я не прав?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902949
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleronmikronпропущено...

Из каких соображений - нелзя? Вера, законадельство или воспитание запрещает?
Учить матчасть
Посмотрел на лозунги на немесном наречии, но ответа на мой вопрос не увидал. Почему нельзя то?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902951
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЕсли на экране или в отчёте 42,13 то осталное вроде как значения не имеет. Где я не прав?

На экране у тебя 42,13 и таких - тысячи, а в месячном отчете отчисления в налоговую составили вместо 50371 руб - 50369 руб. И уже статья.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902961
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisНа экране у тебя 42,13 и таких - тысячи, а в месячном отчете отчисления в налоговую составили вместо 50371 руб - 50369 руб. И уже статья.
А каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902965
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПочему нельзя то?
Потому что это деньги, а деньги любят точный счет. double используется, если точность после запятой неважна. Так понятнее на 'местном наречии'?
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902966
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisНа экране у тебя 42,13 и таких - тысячи, а в месячном отчете отчисления в налоговую составили вместо 50371 руб - 50369 руб. И уже статья.а еще проверка на равенство
30 + 12,13 = 42,13
не сработает, упс, счета не сходятся, пошло поехало...
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902969
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?
Потому что, если эта сумма будет суммироваться из множества рублевых с копейками сумм, у вас может получиться разброс в итоговой сумме - в большую или меньшую сторону. Ибо double точности НЕ ГАРАНТИРУЕТ!
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902974
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?
round(42.1299999876, 2) + round(42.1299999876, 2) + round(42.1299999876, 2)
и
round(42.1299999876 + 42.1299999876 + 42.1299999876, 2)
совсем не одно и то же

и чем больше таких операций, тем больше расхождение

поиграй с калькулятором, раз сразу неочевидно
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902978
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronА каким образом мы пришли к 50371 руб / 50369 руб? И каким образом всё это связано с машинным представлением данных?у тебя есть рулетка на 1 метр. Ты можешь отмерить ей километр (допустим, точность твоих рук позволяет это сделать)

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

Сколько будет "разбег", когда ты отмеришь ей километр? А 10 километров? то-то.
Деньги такого не терпят
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902981
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronПочему нельзя то?
Потому что это деньги, а деньги любят точный счет. double используется, если точность после запятой неважна. Так понятнее на 'местном наречии'?
Это ваше убеждение. Вы попробуйте аргументами, а не внушением. Почему нелзя? Достаточно привести один пример,
где хранение данных в доубле не позволяет достич определённой (на ваш выбор) цели обработки данных.
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902988
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДостаточно привести один пример,
где хранение данных в доубле не позволяет достич определённой (на ваш выбор) цели обработки данных.пжалста
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38902995
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron Достаточно привести один пример,
где хранение данных в доубле не позволяет достич определённой (на ваш выбор) цели обработки данных.

Вот пример
Код: c#
1.
2.
3.
4.
5.
static void Main(string[] args)
        {
            var list = Enumerable.Repeat<double>(42.69, 100000);
            Console.WriteLine(list.Sum());
        }



Должно быть 4269000, получаем 4268999,99999594
...
Рейтинг: 0 / 0
Значение слишком мало или слишком велико для decimal - как бороться?
    #38903000
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа еще проверка на равенство
30 + 12,13 = 42,13
не сработает, упс, счета не сходятся, пошло поехало...

В этом примере есть две явных операции и одня неявная: сложения, сравнения и приведения.
При этом иммено привидение теряет точность. Другими словами мы видим или пишем (42,13) не то что получим
в результате машинной обработки. Если же иметь эту операцию приведения в виду, то результат
(30 + 12,13) - 42,13 будет условно равен погрешности, которая принимается нами уже на первом шаге неявного приведения. Таким образом если мы согласимся принятъ погрешность приведения то и на этапе сравнения нужно это учитывать. Проблем нет. Это не коим образом не ограничивает приминение доубле.
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Значение слишком мало или слишком велико для decimal - как бороться?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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