Я использую десятичный тип данных во всем своем проекте, полагая, что это даст мне самые точные результаты. Тем не менее, я столкнулся с ситуацией, когда ошибки округления ползут, и кажется, что мне лучше использовать удвоения.Вопросы округления с десятичной точностью
У меня есть этот расчет:
decimal tempDecimal = 15M/78M;
decimal resultDecimal = tempDecimal * 13M;
Здесь resultDecimal является +2,4999999999999999, когда правильный ответ на 13 * 15/78 составляет 2,5. Кажется, это потому, что tempDecimal (результат 15/78) является повторяющимся десятичным значением.
Я впоследствии округляя этот результат нулевых знаков после запятой (от нуля), который я ожидал, чтобы быть в этом случае 3, но на самом деле становится 2.
Если я использую два раза вместо:
double tempDouble = 15D/78D;
double resultDouble = tempDouble * 13D;
Затем я получаю 2.5 в resultDouble, который является ответом, который я ищу.
Из этого примера я чувствую, что лучше использовать удвоения или поплавки, даже если они имеют меньшую точность. Я предполагаю, что мне удается получить неправильный результат 2.4999999999999999 просто потому, что десятичная точка может хранить результат до такого количества знаков после запятой, тогда как двойной округляет его.
Должен ли я использовать двойники вместо этого?
EDIT: этот расчет используется в финансовом программном обеспечении для определения того, сколько контрактов распределено для разных портфелей, поэтому важно выбирать между 2 или 3. Меня больше интересует правильный расчет, чем со скоростью.
Вероятно, вы можете найти другую ситуацию, когда результат десятичной точности правильный, а двойной результат - неправильный. –
Если вы делаете научные или инженерные расчеты, а не финансовые расчеты, вы все равно должны использовать 'double', так как это в сотни раз быстрее, чем' decimal'. –
@Damien_The_Unbeliever Я мог видеть, что я не могу получить результат для большого количества десятичных знаков с двойным, но учитывая, что я в конечном счете округляю до нуля десятичных разрядов, мне очень нравится получить неправильный конечный результат с двойным? –