Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! Таблица содержит поле типа REAL. Признаюсь, что это деньги. Знаю, что денежки лучше хранить в копейках, но вот руки пока не дойдут до изменения структуры. А теперь, если не брать во внимание то, что это деньги, т.е. рассматривать общий случай. Сейчас для себя хочу прояснить некоторый общий случай для решения проблемы сложения вещественных чисел. Стоит задача - сложить REAL-значения полей таблицы. Учитывая то, что получаем погрешность в вычислениях в стандартном решении Код: plaintext Вариант: Есть ли возможность операции сдвига плавающей запятой вправо на 2 позиции? Тогда можно было было складывать не REAL-значения, а целые части от умноженного на 100 значения. Что-то типа Код: plaintext Может есть другие, пусть непримитивные, решения? С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 13:11 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
/а умножить на 100 и отбросить(округлить) дробную часть не пробывал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 13:14 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Пробовал. Иначе бы не справшивал про сдвиги. Код: plaintext Код: plaintext Есть еще варианты? Может с преобразованием типов? С использованием строковых типов? Для меня пока не важна скорость вычисления (я все равно вскоре перейду на копейки) - мне важен верный результат. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 14:37 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пример того, что не нравится, можете привести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 14:49 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЗдравствуйте. Пример того, что не нравится, можете привести?Мне не нравится то, что при сложении REAL-значений максимум с двумя знаками после запятой я получаю погрешность в сотых долях. Одно из решений - хранить значения в копейках (х100). Это будет решено, но позднее. А сейчас думаю, как подшаманить скрипт так, чтобы погрешности при суммировании избежать. Были варианты складывать целые части от умноженного на 100 значения. Допускается получить сумму копеек - в приложении я это обработаю. Но скрипт Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 15:59 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Попробуйте Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 16:20 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Скрипты Код: plaintext Код: plaintext Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 17:43 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
А так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 18:28 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Не прокатывает. Получается тот же результат - 972114.70 . Может легче будет копейки получить? Результат 97211471 меня бы устроил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 08:47 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Semen PopovНе прокатывает. Получается тот же результат - 972114.70 . Может легче будет копейки получить? Результат 97211471 меня бы устроил.Странно. Я взял ваши цифры, вставил в темповую таблицу на своей v9.1.5 и в сумме получил 972114.71 этим запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 09:39 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Если деньги хранятся в неокруглённом виде, то мы используем udf для округления, насколько я знаю проблем с этим у нас не было, надо только пред суммированием округлять, что в примере Марка и сделано. SELECT SUM(ROUND(COST,2)) FROM .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 10:22 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Я бы вот чего от себя добавил... В DB2 есть 2 функции round: sysfun.round - она отбрасывает, а вот sysibm.round - округляет... По умолчанию используется sysfun.round... Сам много времени потерял из-за этого ньюанса.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 10:37 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
TORTЯ бы вот чего от себя добавил... В DB2 есть 2 функции round: sysfun.round - она отбрасывает, а вот sysibm.round - округляет... По умолчанию используется sysfun.round... Сам много времени потерял из-за этого ньюанса....Так не должно быть. Согласно SQL path considerations for built-in functions , если в SYSIBM есть функция с подходящими числом и типом параметров, то будет использоваться именно она. Что у вас выдает: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 11:11 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein , похоже что Вы правы... По-моему у меня другая проблема была... Кажется я сам прописывал схему sysfun при вызове и получад немного не то, что ожидал.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 11:45 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за отзыв. У меня DB2 версии 8.1.14. Заметил такую ситуацию. Скрипт Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 10:29 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Semen PopovВыходит, что округлять нужно только итоговый результат? Реально округлять нужно там, где это нужно (смешно звучит, но так и есть). Пример: в банк положили 100 рублей, потом начислили проценты, например сумма стала, 101.487. Потом на этот же счёт положили еще 100 рублей. Два варианта расчёта суммы: 1. 100.487 + 100 = 200.487 2. 100.49 + 100 = 200.49 Т.е. здесь округление, возможно, будет некорректным, поскольку деньги лежат и копятся, добавляются проценты и т.п. Хотя лично я не знаю как банки округляют, а потому пример чисто теоретический. Другой пример: есть база товара, в которой розничная цена товара одного наименования складывается из нескольких составляющих, которые включают начисление процентов и т.п. Нам надо сосчитать сумму розничной цены всего товара на складе. Очевидно считать надо так: SELECT SUM(ROUND(COST,2)) FROM STOCK WHERE ... В противном случае мы получим некорректную сумму. Резюме: округление необходимо производить в нужном месте, согласно бизнес логике процесса пересчёта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 18:54 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Vladimir KiselevРеально округлять нужно там, где это нужно (смешно звучит, но так и есть).Да, я знаю, что в бухгалтерии разные правила вычислений. Например, можно иметь два денежных значения 100.144 и 100.353 , с которых нужно получить сумму. В первом варианте можно сложить округленные до сотых значения и получится сумма 100.49 . Во втором можно сначала сложить значения, затем округлить итог. Тогда получим сумму 100.50 . Понятно, что эти правила должна мне указать бухгалтерия. Но, мой случай простой. Нужно просто просуммировать поля, в которых пользователи из приложения "визуально" сохраняли только рубли с копейками (целые с сотыми долями). Складывая сотые должно получится число не более, чем с двумя знаками после запятой. Как хранятся эти деньги в базе - это другой вопрос. Проблема техническая. Моя, а не у бухгалтера. Вот и думаю, пытаюсь выявить для себя какую-то закономерность, правило, как ведёт себя DB2 при сложении вещественных значений, какую команду ей указать, чтобы сложение было верным. Я более, чем уверен, что ошибка у меня закралась не в скриптах, а в значениях. Возможно, одно из значений при округлении Код: plaintext В любом случае, думаю, что правило Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2008, 09:34 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Не для обсуждения, может это натолкнёт Вас на мысль, у Вас прозвучало, что с помощью формул Excel Вы получаете один результат, а с помощью DB2 другой, вероятно в данном случае искать нужно в разнице реализации расчётов в Excel и DB2 (Ваш скрипт). В Excel, по мимо прочего есть понятие отображения данных и хранения. Собственно это всё, удачного поиска ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2008, 09:25 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Vladimir KiselevНе для обсуждения, может это натолкнёт Вас на мысль, у Вас прозвучало, что с помощью формул Excel Вы получаете один результат, а с помощью DB2 другой, вероятно в данном случае искать нужно в разнице реализации расчётов в Excel и DB2 (Ваш скрипт). В Excel, по мимо прочего есть понятие отображения данных и хранения. Собственно это всё, удачного поиска ;)Это верно. Спасибо. Но, думаю, Excel здесь не причем. Я скинул данные с html-страницы, в которую вывел значения из набора Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2008, 10:19 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Semen PopovЕще раз наталкиваюсь на мысль, что проблема в отображении значений в java-приложении. Там также используются вещественные переменные. Какое-то из значений DB2 показывается нормально, но реально имеет погрешность. Для Java: 1. Не используйте тип float, пользуйтесь типом double для любых вещественных операций. Проверено практикой. 2. Как делаете преобразование в яве из вещественного в строку? По дефолту можно иногда получить не совсем то что хотелось. Рекомендация: пользоваться DecimalFormat. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2008, 10:37 |
|
||
|
Сумма денег в REAL-значениях
|
|||
|---|---|---|---|
|
#18+
Евгений ХабаровДля Java: 1. Не используйте тип float, пользуйтесь типом double для любых вещественных операций. Проверено практикой. 2. Как делаете преобразование в яве из вещественного в строку? По дефолту можно иногда получить не совсем то что хотелось. Рекомендация: пользоваться DecimalFormat.Большое спасибо. Уже обнаружил несоответствие Вашим рекомендациям. Будем исправлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2008, 11:36 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35584094&tid=1603650]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 367ms |

| 0 / 0 |
