double сохраняет данные не в точном виде. Нужен ли тип данных, который будет сохранять все знаки после запятой в точном виде? - страница 3

 
Dmitry Fedoseev:

Так не надо делать. 

Надо так:

а если нужно прибавлять каждый раз другое значение?
 
multiplicator:
а если нужно прибавлять каждый раз другое значение?

Определиться с точностью с которой надо это делать и после каждого сложения нормализовать.

 

Не вижу повода для дискуссии.

Тип Double реализован на уровне железа процессора, и поэтому он обязательно должен быть в любом языке.

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

Я вот недавно написал себе класс CFraction - простые дроби. Может быть, кто-то и простые дроби хочет иметь на уровне компилятора ?

 
Приведите пример специализированных финансовых приложений, где используется более длинный формат данных, чем double. Даже в бухгалтерских программах всегда производится округление. Представьте себе годовой баланс с кучей знаков после запятой. Ну или например, компания задолжала налогов на 0.000000001 копейки. Нонсенс? А почему тогда в трейдинге это не нонсенс? Точных расчётов всё равно не бывает кроме тех случаев, когда целые числа складываются или вычитаются. Значит, надо округлять, делая это сообразно с задачами, которые нам интересны. И ещё важный момент. Для расчётных задач нужно применять формат данных, который требует минимум преобразований из одного формата в другой, т.к. уже на этом этапе могут возникать ошибки. Ну вот хотя бы арифметический сопроцессор может работать как с 64-битными, так и с 80-битными данными. Но преобразования между ними - времяёмкий процесс с неизбежной потерей точности. Оптимизация софта это ещё и минимизация числа преобразований между данными. 
 
разве не лучше работать с точными числами, чем с неточными?
 
multiplicator:
разве не лучше работать с точными числами, чем с неточными?

Работайте.

 
multiplicator:
разве не лучше работать с точными числами, чем с неточными?

Лучше. Но, далеко не везде могут получиться точные значения. Найди, скажем, среднегеометрическое значение из трех и более чисел...

Мир несовершенен, и ему совершенно все равно, что нам лучше.

Греки тоже, когда узнали, что SQRT(2) нельзя представить в виде отношения целых чисел - сильно огорчились, по легенде Пифагор, считавший, что все в природе можно представить в виде отношения целых чисел - приказал убить нашедшего доказательство.

Посему - разумно пользоваться возможностями, предоставляемыми процессором (стандартный double), а для особых случаев - написать свой класс.

 
Artyom Trishkin:

Работайте.

нету возможности
 
multiplicator:
нету возможности

Как "нету" ???

Объявляешь класс CDecimal - и вперед, будет у тебя значения с фиксированной десятичной точкой.

 
multiplicator:

не поможет. будет просто округлять до этого знака.


Добавьте  фигурные скобочки, что бы нормализация была после каждого прибавления, а не один раз в конце.