Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Операции с Currency


Страницы:   1 2

Дмитрий СС ©   (2014-02-07 19:34:00) 

Добрый день.
Пусть есть переменная Foo: Currency.

Подскажите, пожалуйста, как наиболее правильно получить:
1. Целую часть (в integer или в currency).
2. Дробную часть (в currency).
3. Округлить (в currency).

Конечно, есть множество функций Trunc, Round, и т. п., но есть сомнения, что они не очень предназначены для Currency.

И вопрос в тему.
Пусть X: Float, N: Integer; (Float - это какой-нибудь тип с плавающей точкой, например, Extended).

Всегда ли вернется TRUE?

X := N; // либо какие-либо операции над X, приводящие к значению N в математическом смысле.
Writeln(N = Trunc(X));


Inovet   (2014-02-08 12:44:00) [21]

> [6] Юрий Зотов ©   (08.02.14 12:41)

Представление и хранение, так и надо, тогда нормально, только округлять до 2 знаков не забывать в нужных местах, обычно перед сохранением. И округлялку надо не ту, что в Делфи, ну это известный факт.


Юрий Зотов   (2014-02-08 12:41:00) [22]

В одном проекте этот вопрос был решен так: все расчеты велись в Extended, а представление результатов - с математическим округлением до 2-х знаков после запятой. Расхождений с калькулятором не наблюдалось.


Inovet   (2014-02-08 09:59:00) [23]

> [3] Дмитрий СС   (07.02.14 20:31)
> У меня считаются деньги и плюс/минус копейка роли не сыграет.

Нифига себе. Люди выворачиваются, чтобы всё до копейки сходилось, а у тебя «не сыграет». Тогда плавающию точку бери и не парься, но вряд ли заказчик тебя похвалит, когда у него разные в разных случаях разные результаты будут получатся на одних и тех же данных. А уж если на ккалькуляторе начнёт проверять...


Rouse_   (2014-02-07 21:43:00) [24]


> Предположим мы имеем C = 5. Может ли так получится, что
> при конвертировании в Extended мы получим не 5, а чуть меньше

Если из целого - не может.


Дмитрий СС   (2014-02-07 20:31:00) [25]


> Хотя у тебя тут всего 4 после запятой - какая точность нужна?

Дело даже не в точности. У меня считаются деньги и плюс/минус копейка роли не сыграет.
Это скорее вопрос порядка в голове. Насколько я понял из окна CPU, для Currency число конвертируется в Extended, округляется и возвращается обратно. Может это и нормально, конечно, учитывая, что при делении происходит то же самое.

Остается другой вопрос:

По сути то же самое происходит и при вызове Trunc:

Unit1.pas.32: C := Trunc(C);
005A829C DF6DF0           fild qword ptr [ebp-$10]
005A829F D8350C835A00     fdiv dword ptr [$005a830c]
005A82A5 E8E6EAE5FF       call @TRUNC
005A82AA 8945D8           mov [ebp-$28],eax
005A82AD 8955DC           mov [ebp-$24],edx
005A82B0 DF6DD8           fild qword ptr [ebp-$28]
005A82B3 D80D0C835A00     fmul dword ptr [$005a830c]
005A82B9 DF7DF0           fistp qword ptr [ebp-$10]
005A82BC 9B               wait

Предположим мы имеем C = 5. Может ли так получится, что при конвертировании в Extended мы получим не 5, а чуть меньше (например, 4,99...998...). Соответственно вызов Trunc вернет 4 и т. д., что приведет к вопросам в дальнейшем.
У меня не очень много опыта работы с числами с плавающей точкой, поэтому прошу поправить меня, если что-то не так.


Rouse_   (2014-02-07 19:55:00) [26]

ЗЫ: это я про тот случай когда проще умножить на 10000 и работать как с целым, чем заморачиваться с запятой...


Rouse_   (2014-02-07 19:53:00) [27]

Все что связано с матсопроцессором, не очень предназначено для точных вычислений из-за погрешности округления, для этого применяются софтверные алгоритмы.
Хотя у тебя тут всего 4 после запятой - какая точность нужна?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо