Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Чудеса с округлением.  [new]
Дмитрий15
Member

Откуда: Новосибирск
Сообщений: 50
В результате вычислений в алгоритме получаю в переменную double число 6
Просмотр в окне watches говорит ровно 6 без дробей
делаю a = fix(переменная) и получаю 5!!!!

Повторяю теже самые вычисления столбиком в excel получаю правильный результат. Где косяк и как лечить.
Догадываюсь, что можно попробовать в fix засунуть + 0.000000001 или что то в этом роде но вот сколько именно?

---
Origin: Женщины и виски размягчают мозг.
21 фев 05, 18:51    [1336590]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
Лцчше функцию Round использовать
если аксесс >97
21 фев 05, 19:25    [1336668]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
Блин, в верхнем закрепленном посте вместо лабуды про правила хорошего тона надо написать:
ЛЮДИ, НЕ ИСПОЛЬЗУЙТЕ ДАБЛ, ВОЗМИТЕ КАРРЕНСИ.
Двадцатый раз минимум про это пишу(или читаю).
22 фев 05, 07:56    [1337038]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Дмитрий15
Member

Откуда: Новосибирск
Сообщений: 50
Shark
Блин, в верхнем закрепленном посте вместо лабуды про правила хорошего тона надо написать:
ЛЮДИ, НЕ ИСПОЛЬЗУЙТЕ ДАБЛ, ВОЗМИТЕ КАРРЕНСИ.
Двадцатый раз минимум про это пишу(или читаю).


А чем же дабл плох (понятно что не работает) но из-за чего? И чем будет currency лучше?
Кстати, прикол то именно в том, что в у
22 фев 05, 08:00    [1337042]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
У карренси целочисленная арифметика, и 2,5+1,5=4
Дабл хранится в виде мантиссы и показателя, и все вычисления на нем по определению приблизительны.
Возможно кому то пригодится дабл для подсчета массы звезд в граммах, но мне он ни разу не потребовался.
22 фев 05, 08:05    [1337051]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Shark
У карренси целочисленная арифметика, и 2,5+1,5=4
Дабл хранится в виде мантиссы и показателя, и все вычисления на нем по определению приблизительны.
Возможно кому то пригодится дабл для подсчета массы звезд в граммах, но мне он ни разу не потребовался.

Да-да-да
Поддерживаю
Хотите получать точные данные - используйте точные (целочисленные) типы данных
Ну не для того дабл был даден
Мало куренси - используйте стрингу + свои функции для арифметики
22 фев 05, 09:21    [1337175]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Мало карренси
Тут ЛП недавно показывал, как тип с фиксированной точкой в Access mdb делать. Я офигел. Практическая ценность сомнительна, тк меня полностью устраивает карренси, но сам факт. Кто захочет-найдет. В посте есть подстрока
"А теперь самое интересное" :-)
22 фев 05, 09:30    [1337195]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Некоторые бухсистемы деньги целыми числами хранят. В копейках (центах, лирах и т.п.)
22 фев 05, 09:32    [1337207]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Программист-Любитель
Некоторые бухсистемы деньги целыми числами хранят. В копейках (центах, лирах и т.п.)

А что куренси как-то по другому это делает?
Насколько я знаю там тоже целое число
Единица измерения одна десятитысячная рубля (доллара)
22 фев 05, 09:38    [1337234]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Имеется в виду, что там на "физическом" уровне целые числа. 100 йен будет хранится как '100' а 100 руб. 45 коп. как '10045'.
22 фев 05, 09:49    [1337277]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18313
но всё равно при делении суммы на количество будут траблы
22 фев 05, 09:52    [1337288]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Не надо делить сумму на количество. :)
22 фев 05, 09:54    [1337294]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Насколько я знаю там тоже целое число
>Единица измерения одна десятитысячная рубля (доллара)

>Имеется в виду, что там на "физическом" уровне целые числа.

:-)
В карренси на физическом уровне целое число.


>но всё равно при делении суммы на количество будут траблы

Нету там траблов. Если не устраивает стандартное округление до одной десятитысячной, никто не мешает написать свою функцию округления-деления.
22 фев 05, 10:10    [1337345]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
Shark
>Мало карренси
Тут ЛП недавно показывал, как тип с фиксированной точкой в Access mdb делать. Я офигел. Практическая ценность сомнительна, тк меня полностью устраивает карренси, но сам факт. Кто захочет-найдет. В посте есть подстрока
"А теперь самое интересное" :-)


Полный бред (про практическую ценность)
22 фев 05, 10:36    [1337447]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Alex P
Member

Откуда:
Сообщений: 27
Shark
Блин, в верхнем закрепленном посте вместо лабуды про правила хорошего тона надо написать:
ЛЮДИ, НЕ ИСПОЛЬЗУЙТЕ ДАБЛ, ВОЗМИТЕ КАРРЕНСИ.
Двадцатый раз минимум про это пишу(или читаю).


лучше не использовать MS Access
22 фев 05, 11:08    [1337567]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
Alex P
Shark
Блин, в верхнем закрепленном посте вместо лабуды про правила хорошего тона надо написать:
ЛЮДИ, НЕ ИСПОЛЬЗУЙТЕ ДАБЛ, ВОЗМИТЕ КАРРЕНСИ.
Двадцатый раз минимум про это пишу(или читаю).


лучше не использовать MS Access


Зачем так жестоко? Просто при подсчёте денег следует использовать типы с данных с фиксированной точкой.
22 фев 05, 11:27    [1337661]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Мшсещырф
Guest
Программист-Любитель
Имеется в виду, что там на "физическом" уровне целые числа. 100 йен будет хранится как '100' а 100 руб. 45 коп. как '10045'.

на физическом уровне currency - 64-битное целое.
4 знака после запятой - "внешнее представление".
можно считать, что currency - это "число с жестким шкалированием"
- пара - 64битное целое + жесткая шкала на 4 десятичных знака после запятой.

Одако не все безоблачно с currency
1) (мелочь)
приведение к currency несколько подглюкивало всегда.
В том смысле, что приведение к целому - CInt, CLng и встроенное методом
присваивания - при приведении округляет половину пятерок вверх, половину вниз, в зависимости от четности цифры в позиции округления.
Это называется "несмещенная оценка среднего". писатели от M$ любят это называть "банковским округлением". Приведение к currency в этом месте работало "ни так ни сяк", смещая оценку несколько вверх, но существенно ниже простого округления 5-ки вверх.

2) (неприятность)
Всегда есть некоторая неуверенность - что же получается в результате
вычисления выражения с участием currency.
Причин для этого две -
а) встроенные механизмы приведения типов
б) реализация арифметики в различных программных слоях от MS

в части а) исповедуется стратегия внутреннего приведения разнотипных значений к "большему" типу в процессе вычисления выражения.
Dim lngVar as Long, intVar as Int
lngVar=5
intVar=10
debug.print lngVar+intVar

в процессе вычисления intVar приводится к Long, а потом получившееся значение добавляется к lngVar.
Делается это в целях уменьшения вероятности переполнения результата.

Проблема здесь в том, что при вычислении выражений c currency
не всегда знаешь, (почти всегда не знаешь), что будет в результате.

dblVal + curVal -> curResult
а
dblVal*curVal -> dblResult

второе можно оправдать тем, что это гарантирует от переполнения.

а первое тем, что если ты собрался что-то складывать, то это, наверно, деньги. Чуть недосмотришь - и как раз получишь переполнение.

Dim dC As Currency
Dim dD As Double
Dim v As Variant
dD = Val("1452344523454534245.2342345445425")
dC = 10.45
v = dD + dC ' тут будет переполнение в примере.
Debug.Print v

в части б) проблема вот в чем.
VBA неплохо осведомлен о currency.
Однако не всякое хост-приложение желает признавать это за тип данных.
Пусть есть ячейка Excel, содержащая отформатированное как деньги значение.
Тогда Value вернет currency - это для внешнего потребителя.
а Value2 - double для тойже ячейки.
В своей внутренней арифметике Excel сориентируется на Value2.
И чтобы изменить это поведение, нужно задать "точность как на экране".

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

Существенно надежнее в этом смысле значения типа Variant подтипа Decimal

Можно считать, что это тоже разновидность целого, но с плавающей шкалой.
Целочисленная подоснова обеспечивает точность вычислений.
Плавающая шкала приводит к тому, что в зависимости от текущей шкалы плывет диапазон доступных в типе значений для данной шкалы.
Похоже, при выходе за границы, работает механизм "перешкалирования".
для всех видов обычных применений тип достаточен.
Есть надежда (уверенность до опыта - экспериментов не проводил), что с появлением типа данных шкалированное действительное соответствующая
арифметика выражений поддержана Jet.

Так что, на сегодняшний день, по крайней мере в Access,
про currency разумно забыть с легким сердцем, перейдя на
Действительное поле/Decimal переменные
В обмен на то, что это самый медленный по скорости операций тип данных.
Но денег он не потеряет и промежуточные результаты сохранит с нужной точностью.














кишки механики вопроса сидят в oleout32.dll, которая обеспечивает
поддержку типов для серверов и клиентов автоматизации.
22 фев 05, 11:28    [1337667]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Полный бред (про практическую ценность)
ДЛЯ МЕНЯ, у которого кроме денег, штук, кубов, килограмм, км и тоннокм никаких чиселок в базюках нет, не надо. 4 знака самое то.
Вам наверно надо, я ж не спорю.
22 фев 05, 11:34    [1337690]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
Shark
>Полный бред (про практическую ценность)
ДЛЯ МЕНЯ, у которого кроме денег, штук, кубов, килограмм, км и тоннокм никаких чиселок в базюках нет, не надо. 4 знака самое то.
Вам наверно надо, я ж не спорю.


кроме тоннорублекилограммов есть ещё такая штука ка переносимость на разные платформы. Numeric(n.m) в этом случае годаздо предпочтительней , чем костыль Currency, который нужен был до появления нормального типа данных в Jet
22 фев 05, 11:42    [1337718]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Мшсещырф
Ниче не понял.
Все описанные беды карренси относятся и к фиксированной точке тоже, и наоборот, описанные радости фиксированной точки распространяются на карренси.
Если вас волнует проблема переполнения карренси при подсчете денег. Могу тока позавидовать. От такой прорвы поди и программеру че-то перепадает:-)

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

Не замечал ни на одной версии.
22 фев 05, 11:48    [1337744]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Мшсещырф
Guest
Shark
>Мшсещырф
Ниче не понял.
Все описанные беды карренси относятся и к фиксированной точке тоже, и наоборот, описанные радости фиксированной точки распространяются на карренси.
Если вас волнует проблема переполнения карренси при подсчете денег. Могу тока позавидовать. От такой прорвы поди и программеру че-то перепадает:-)

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

Не замечал ни на одной версии.


1) у currency как типа нет бед. а деньги вам считать, судя по всему не приходится. Иначе Вы были бы внимателнее к выражениям
(арифметическим) :))

2) речь идет о вычислении выражений и функций в запросах.
даже простой
SUM([currencyField]) не гарантирован.
а
SUM(dblRate*[currencyField]) - точно вычислит температуру на Марсе.
22 фев 05, 12:03    [1337829]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Shark
Member

Откуда:
Сообщений: 2365
>SUM([currencyField]) не гарантирован.
без примера я буду расценивать это как вранье, а если будет пример, то ОГРОМНАЯ от меня благодарность и я БЕГОМ с карренси
>SUM(dblRate*[currencyField]) - точно вычислит температуру на Марсе.
Дык а Вы чего хотели?
22 фев 05, 12:10    [1337856]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Я во всех денежных расчетах стараюсь сначала преобразовать карренси к децимал с запасом побольше, потом на всякие курсы, коэффициенты перемножить/разделить, а потом результат - обратно в карренси.

Иначе на большом количестве записей очень ощутимые невязки начинают накапливаться (в несколько рублей/долл/евро, бывает до 10).

Или алгоритм составить так, чтобы сначала как можно дольше складывать в одинаковых валютах и в последний момент по курсу пересчитывать.
22 фев 05, 12:19    [1337901]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Мшсещырф
Guest
Shark
>SUM([currencyField]) не гарантирован.
без примера я буду расценивать это как вранье...


уж лучше пусть это будет вранье...
:))

в Jet 4 я этого не видел.

вот сел проверить - как оно навскидку ведет себя в выражениях.

выкладываю ...

....
22 фев 05, 14:08    [1338320]     Ответить | Цитировать Сообщить модератору
 Re: Чудеса с округлением.  [new]
Мшсещырф
Guest
пардон

К сообщению приложен файл (currencySample.zip - 13Kb) cкачать
22 фев 05, 14:13    [1338346]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить