Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Описание проблемы: 1 ШАГ: При вычислении следующей цепочки получаем следующее: r1 = 100 * 771215 / 7042816 = 10,95037837 Данное число программой сохраняется в поле PSUM decimal(20,3) и самой СУБД обрезается до 3х знаков проверяем и получаем значение: r1 = 10,950 2 ШАГ: получаем данное число из таблицы и округляем до 1 знака командой тоже на уровне СУБД: ROUND(r1, 1) У клиента на сервере Informix 9.4 получается r = ROUND(r1, 1) = 10.9 У меня на сервере Informix 7.3 получается r = ROUND(r1, 1) = 11 Если клиент выполняет строку: select round(10.950, 1) from table у него тоже получается 11 Делаю вывод: что сама функция округления ROUND работает корректно. Возможно дело именно в хранении дробных чисел на уровне СУБД или каких-то настроек. Т.е число 10.950 Informix 9.4 хранит как 10.49999999 например. Может кто-нибудь прояснить в чем может быть проблема или описать как хранятся дробные значения на уровне СУБД Informix более подробно? Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 14:00 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 14:10 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис 10,950 11,0 Аналогично для IBM Informix Dynamic Server Version 9.30.ТC2 Подозреваю, что у вашего клиента могут быть расхождения с вами в десятичном разделителе (у кого то точка, а у кого запятая), т.е. вопросы локали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 14:58 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис 10,950 11,0 Аналогично для IBM Informix Dynamic Server Version 9.40.ТC5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 15:07 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
А какой ответ правильный? 11 или 10.9 ? Я честно говоря не знаю как работает round в информиксе по каким правилам. Например x86 может округлять .5 в разные стороны, у него есть режимы. У других процов наверно тоже что-нить этакое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 15:21 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Пральное значение 11. Округление по правилам математики. Большое спасибо за консультацию. Будем разбираться с заказчиком. О результатах сообщю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 08:16 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
bes385Пральное значение 11. Округление по правилам математики. ... В смысле в вашей компании такие правила приняты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 09:00 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
К проблеме округления, с Информиксом не связано. http://www.sql.ru/forum/actualthread.aspx?tid=412838&hl=%ee%ea%f0%f3%e3%eb http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 11:52 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
zenkК проблеме округления, с Информиксом не связано. Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 12:37 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис zenkК проблеме округления, с Информиксом не связано. Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх. Да и меня еще в школе учили то же самое делать (т.е. 0,5 округлялось до 1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 20:43 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
vasilis Журавлев Денис zenkК проблеме округления, с Информиксом не связано. Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх. Да и меня еще в школе учили то же самое делать (т.е. 0,5 округлялось до 1)люди с нетрадиционной математической ориентацией любят округлять к четному ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 09:21 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
.NETБанковское округление Если складывать много чисел, округляя .5 всегда в большую сторону, то возникнет перекос, который будет тем больше, чем больше чисел мы складываем. Банковское округление позволяет минимизировать этот перекос. В этом случае половина округляется к ближайшему четному. Метод Round() класса Math реализует именно банковское округление. В качестве параметра он принимает округляемое значение и, возможно, точность, до которой необходимо выполнить округление. Если точность не указана, то округление выполняется до целого. Случайное округление Понятно, что если преобладают четные или нечетные числа, то даже банковское округление создаст перекос. В этом случае можно применить, так называемое, случайное округление, когда половина округляется в большую или меньшую сторону по случайному закону. Однако, суммирование одних и тех же данных при таком округлении может давать разные результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 10:09 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Вот уточнение проблемы: Тот пример - оказывается был не совсем корректным. Все округлялось правильно до 11 и все нормально. Оказалось дело немного в другом: У меня в программе генерируется процедура для расчета некоторых показателей. Значения показателей могут быть различными и потому в процедуре используется тип FLOAT т.к. заранее не могу сказать какая точность должна быть. Следующий пример проверен и у меня и у заказчика. Результаты разные. create table tbl(a decimal(10, 3)) create procedure TMP_ROUND() begin define GLOBAL A,B,C float DEFAULT NULL; begin let A=10.950; let B=1; let C=ROUND(A, B); delete from tbl; insert into tbl(a) values(C); end; end; end procedure; execute procedure TMP_ROUND() select * from tbl Получается следующая штука: У заказчика получилось значение: 10.9 (Informix 9.4) У меня : 11 (Informix 7.3) Подозреваю что проблема из-за хранения данных типа FLOAT. Т.е. число 10.950 преобразовывается во FLOAT как 10.949999 Затем после округления получаем 10.9 Но у меня то на сервере Informix 7.3 получается 11. Это значит что есть либо какие настройки для типов хранения, либо это особенность более поздней версии Informix. Вопрос: 1) Проверьте пожалуйста указанный выше новый пример на ваших версиях Informix 9.3, 9.4, 10? 2) Подскажите есть ли какие настройки управления типами хранения (может быть они задаются при первоначальном создании БД) Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 11:40 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Не используйте float. Используйте Decimal(10,6) Результат с флоат будет разный естественно, возможно будет зависеть от процеесора, величины числа и т.д.. Тем более что в 9-ке вообще раунд сделан иначе чем 7-ке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 11:46 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис vasilis Журавлев Денис zenkК проблеме округления, с Информиксом не связано. Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх. Да и меня еще в школе учили то же самое делать (т.е. 0,5 округлялось до 1)люди с нетрадиционной математической ориентацией любят округлять к четному Да я ранее уже прочитал приведенные ссылки... Просто в твоей фразе "Похоже они решили всегда округлять 5-ку вверх" прозвучал, как мне показалось, упрек в сторону разработчиков, вот я и решил за них заступиться :) Они реализовали стандартный арифметический метод и правильно сделали (это же не бухгалтерский сервер :) Round из MS Sql Server также выполняет математическое округление. В Oracle, наверное, как и в Греции, "все есть" :) Другой вопрос, почему в Инф. не сделали и "бухгалтерское округления" ? Наверное, не было нормального стандарта или посчитали, что все остальное (как и OLAP, статистика и пр.) должно быть реализовано уже на сервере приложения или клиенте. Мне кажется значительно более странным, когда "В .NET статический метод Round() класса Math округляет половину к ближайшему четному" и для арифметического округления нужно реализовывать свои методы. ( http://developerguru.net/archive/2006/08/14/How-to-using-Round-in-.NET.aspx) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 11:47 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
vasilis.. Просто в твоей фразе "Похоже они решили всегда округлять 5-ку вверх" прозвучал, как мне показалось, упрек в сторону разработчиков, вот я и решил за них заступиться :) ...Боже, нет это был не упрек. Я перечитал документацию по round, не нашел там описания правила по которому округляется. На практике выяснил что используется округление вверх, и написал что написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 11:51 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
bes385 select * from tbl a 11,000 IBM Informix Dynamic Server Version 10.00.UC3 Linux nag 2.6.13-15-smp #1 SMP Tue Sep 13 14:56:15 UTC 2005 i686 i686 i386 GNU/Linux ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:01 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
bes385Подозреваю что проблема из-за хранения данных типа FLOAT. Т.е. число 10.950 преобразовывается во FLOAT как 10.949999 Затем после округления получаем 10.9 по-моему float ни при чем у меня 10.00.UC6 и с float и с decimal 11 получается Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:13 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Журавлев ДенисНе используйте float. Используйте Decimal(10,6) Результат с флоат будет разный естественно, возможно будет зависеть от процеесора, величины числа и т.д.. Тем более что в 9-ке вообще раунд сделан иначе чем 7-ке. А вдруг понадобятся значения с 7 или 8 знаками после запятой. Можешь описать чем отличается раунд в 9 от 7. И еще - вычитал что есть такой параметр DBFLTMASK который как раз управляет отображением и по ходу хранением чисел типа FLOAT Дополнительно: А может быть отличие из-за ОС на серверах? У нас Window у них UNIX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:15 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
bes385Дополнительно: А может быть отличие из-за ОС на серверах? У нас Window у них UNIX. Именно в этом, а если точнее, то в архитектуре процессора. Денис ведь уже говорил "возможно будет зависеть от процеесора". Это особенность описана в характеристиках типа данных Float (по крайней мере, ранее точно оговаривалось, типа такого (для 7-ки)): "Количество значащих цифр может изменяться на разных платформах. Для данных этих типов происходит отсечение по последней значащей цифре (данные не округляются). Поля типа FLOAT не обязательно хранят большие числа; они хранят числа с большей точностью. Для хранения на диске поля типа FLOAT используется 8 байт, а для типа SMALLFLOAT – 4 байта." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:41 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
bes385А вдруг понадобятся значения с 7 или 8 знаками после запятой. Ну так сделай Dec(30,10) или ту точность, которая тебе нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:44 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
В информиксе абсолютно настоящий float : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 12:44 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Тан bes385Подозреваю что проблема из-за хранения данных типа FLOAT. Т.е. число 10.950 преобразовывается во FLOAT как 10.949999 Затем после округления получаем 10.9 по-моему float ни при чем у меня 10.00.UC6 и с float и с decimal 11 получается 10.00.ТC6 - с decimal 11, с float 11 9.40.TC7 - с decimal 11, с float 10,9 9.30.TC1 - с decimal 11, с float 10,9 7.31.ТC8 - с decimal 11, с float 11 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:11 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
time echo "select dc_test(9999999)||'' from table(set{1}) "| dbaccess a real 0m36.876s time echo "select emp1_test(9999999)||'' from table(set{1}) "| dbaccess a real 0m29.218s Сложение десималов 7 сек. time echo "select flt_test(9999999)||'' from table(set{1}) "| dbaccess a real 0m28.399s time echo "select emp2_test(9999999)||'' from table(set{1}) "| dbaccess a real 0m27.544s Сложение флоатов 1 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 14:02 |
|
||
|
Округление decimal в Infomrix
|
|||
|---|---|---|---|
|
#18+
Тан 10.00.UC6 - с decimal 11, с float 11 10.00.ТC6 - с decimal 11, с float 11 9.40.TC7 - с decimal 11, с float 10,9 9.30.TC1 - с decimal 11, с float 10,9 7.31.ТC8 - с decimal 11, с float 11 Получается интересная фишка. У девятки ROUND по другому работает и только у неё? Может это бага? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 15:55 |
|
||
|
|

start [/forum/topic.php?fid=44&fpage=41&tid=1608281]: |
0ms |
get settings: |
6ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 261ms |
| total: | 423ms |

| 0 / 0 |
