Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Округление при запросе к полю с плавающей точкой / 15 сообщений из 15, страница 1 из 1
20.03.2015, 10:17
    #38910713
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Добрый день
Попросили разобраться с такой проблемой - есть запрос, тянущий данные документов из спецификации, в том числе и цену, причем цену он считает как сумма в документе разделить на кол-во, иногда оно получается с большим знаменателем, например 32.52727777777778, но в запросе он округляется до двух символов. Когда это выгружается в 1с, то они считают это округленное значение умножить на кол-во и получают сумму по этому товару чуть больше. Как это в ODBC победить? При том же запросе из isql - получаю числа без округления, IBE показывает округленно, но при наведении курсора - показывает полное значение.
...
Рейтинг: 0 / 0
20.03.2015, 10:31
    #38910728
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Gallemar,

1 диалект? Или хранишь числа как DOUBLE PRECISSION?
Я бы посоветовал для внутренних расчётов от всяких там делений брать точность побольше, например 4, а не 2 знака.
...
Рейтинг: 0 / 0
20.03.2015, 10:38
    #38910738
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Симонов Денис, первый диалект. Сорри,соврал немного - не до двух,а до трех.
...
Рейтинг: 0 / 0
20.03.2015, 11:33
    #38910848
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
GallemarКогда это выгружается в 1с, то они считают это округленное значение
умножить на кол-во и получают сумму по этому товару чуть больше. Как это в ODBC победить?

Раз у тебя неверно считает 1С, то и побеждать надо в 1С.

Кстати, разве считать цену по среднему не запрещено теперь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2015, 11:42
    #38910877
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Gallemar,

вообще это странно. Если как ты сказал округляется до трёх знаков, то
32.527 * N < 32.52727777777778 * N ? т.е. должно получится меньше
если до 2ух 32.53 * N > 32.52727777777778 * N то будет больше

В общем случае схождения результатов из-за ошибок округления не решаемая задача.

Я бы предложил округлять до 4ёх знаков. N какой приблизительно. Можешь назвать максимум?
...
Рейтинг: 0 / 0
20.03.2015, 11:55
    #38910907
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Симонов Денис,

DOC_DATE DOCINDEX ID_CLIENTS ARTICUL PRICERUB QUANTITY OSTATOK
=========== ======== ============ ============================== ======================= ======================= =======================
19-MAR-2015 10458 87010 78.99000000000000 24.00000000000000 1.000000000000000
19-MAR-2015 10458 156506 113.4100000000000 12.00000000000000 6.000000000000000
19-MAR-2015 10458 155059 113.9200000000000 12.00000000000000 6.000000000000000
19-MAR-2015 10458 155046 32.52727777777778 180.0000000000000 210.0000000000000
19-MAR-2015 10458 134865 49.11000000000000 20.00000000000000 16.00000000000000
19-MAR-2015 10458 155038 126.7100000000000 12.00000000000000 1.000000000000000
19-MAR-2015 10458 98326 96.02000000000000 12.00000000000000 15.00000000000000
19-MAR-2015 10458 67871 74.10000000000001 12.00000000000000 4.000000000000000
...
Рейтинг: 0 / 0
22.03.2015, 05:47
    #38912216
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Gallemar,

вот простой пример:
Колво = 29
Сумма = 112.35
Цена = Сумма / Колво = 3.87414
ЦенаОкругл = 3.87
Сумма1С = ЦенаОкругл * Колво = 112.23 - совсем не равно 112.35

Т.ч. как костыльный выход - не округлять цену до 2 знаков "при передаче в 1С". А нормальный выход - хранить цену и передавать ее куда и когда надо.
...
Рейтинг: 0 / 0
22.03.2015, 05:48
    #38912217
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
YuRockне округлять цену до 2 знаков
и до 3х, и до 4х..
...
Рейтинг: 0 / 0
23.03.2015, 09:13
    #38912800
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
YuRockТ.ч. как костыльный выход - не округлять цену до 2 знаков "при передаче в 1С".Насколько я понял ТС-а, оно у него "само" где-то округляется.
...
Рейтинг: 0 / 0
23.03.2015, 17:50
    #38913876
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
ExterisНасколько я понял ТС-а, оно у него "само" где-то округляется.Ну значит не повезло ему в жизни. Тогда единственный выход - поставить в настройках галочку "Само не округлять".
...
Рейтинг: 0 / 0
24.03.2015, 07:17
    #38914338
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
YuRockExterisНасколько я понял ТС-а, оно у него "само" где-то округляется.Ну значит не повезло ему в жизни. Тогда единственный выход - поставить в настройках галочку "Само не округлять".
Объяснил специалистам желтой программы кто им жить счастливо мешает,дальше не моя забота.
p.s. если у кого есть код подключения из 1с к FB с помощью ODBC (не ADO!!!!) - поделитесь пожалуйста.
...
Рейтинг: 0 / 0
25.03.2015, 01:04
    #38915810
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Gallemarp.s. если у кого есть код подключения из 1с к FB с помощью ODBC (не ADO!!!!) - поделитесь пожалуйста.

а это как? вот мне тоже интересно.

особенно без объекта ADODB.Connection и ADODB.RecordSet.
тебе вообще что нужно? работать с базой Firebird прямо из родного скрипта 1С?
тогда вот так можно.
...
Рейтинг: 0 / 0
25.03.2015, 16:23
    #38916743
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
PEAKTOP,думаю что округление идет при работе через ADO, пока правда не проверял,
некогда было.
...
Рейтинг: 0 / 0
25.03.2015, 17:17
    #38916798
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
Gallemar,

Я подозреваю, что "жёлтая программа" тут не при чём.
У тебя число как NUMERIC(15,3) объявлено, поди? Дело в особенности первого диалекта. Внутри число хранится как DOUBLE PRECISION, и любые расчёты ведутся с полной точностью, на сколько цифр хватит.
Тогда как разные "клиентские" библиотеки ведут себя по-разному с такими числами. Кто-то тупо получает как есть, double, а кто-то честно приводит к виду, заданному в типе, т.е. NUMERIC(15,3)

Проблема не в округлении, а в том, что ты позволяешь системе хранить неокруглённые под твоим контролем данные и использовать их для расчёта.
...
Рейтинг: 0 / 0
26.03.2015, 04:24
    #38917179
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление при запросе к полю с плавающей точкой
WildSeryGallemar,
Я подозреваю, что "жёлтая программа" тут не при чём.
У тебя число как NUMERIC(15,3) объявлено, поди?
Ты прав. Хранится как
Код: plaintext
1.
2.
3.
CREATE DOMAIN T_MONEY AS
DOUBLE PRECISION
DEFAULT 0
NOT NULL;
но желтая программа оказалось не при чем. Для выгрузки в 1с из терминала сбора данных использовался xml, а так как торговая система не умеет импортировать его, приходилось xml конвертировать в xls скриптом на powershell, вот там и происходило округление.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Округление при запросе к полю с плавающей точкой / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]