powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Округление decimal в Infomrix
25 сообщений из 25, страница 1 из 1
Округление decimal в Infomrix
    #34860211
bes385
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описание проблемы:

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 более подробно?

Большое спасибо!
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34860259
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table dec_test(a decimal (20,3));
insert into dec_test values (100 * 771215 / 7042816);
select a||'' from dec_test
union all
select ROUND(a, 1)||'' from dec_test;

10,950
11,0

IBM Informix Dynamic Server Version 10.00.UC3 
intel x86 linux
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34860489
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис
10,950
11,0

Аналогично для IBM Informix Dynamic Server Version 9.30.ТC2

Подозреваю, что у вашего клиента могут быть расхождения с вами в десятичном разделителе (у кого то точка, а у кого запятая), т.е. вопросы локали
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34860532
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис
10,950
11,0

Аналогично для IBM Informix Dynamic Server Version 9.40.ТC5
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34860593
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой ответ правильный? 11 или 10.9 ?
Я честно говоря не знаю как работает round в информиксе по каким правилам.

Например x86 может округлять .5 в разные стороны, у него есть режимы. У других процов наверно тоже что-нить этакое.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34867831
bes385
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пральное значение 11. Округление по правилам математики.
Большое спасибо за консультацию.
Будем разбираться с заказчиком.

О результатах сообщю!
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34867876
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bes385Пральное значение 11. Округление по правилам математики.
...
В смысле в вашей компании такие правила приняты.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34868399
zenk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К проблеме округления, с Информиксом не связано.

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
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34868612
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zenkК проблеме округления, с Информиксом не связано.
Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34870241
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис zenkК проблеме округления, с Информиксом не связано.
Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх.
Да и меня еще в школе учили то же самое делать (т.е. 0,5 округлялось до 1)
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34870606
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilis Журавлев Денис zenkК проблеме округления, с Информиксом не связано.
Это проблемы которые должны были встать перед разработчиками информикса. Похоже они решили всегда округлять 5-ку вверх.
Да и меня еще в школе учили то же самое делать (т.е. 0,5 округлялось до 1)люди с нетрадиционной математической ориентацией любят округлять к четному
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34870691
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETБанковское округление

Если складывать много чисел, округляя .5 всегда в большую сторону, то возникнет перекос, который будет тем больше, чем больше чисел мы складываем. Банковское округление позволяет минимизировать этот перекос. В этом случае половина округляется к ближайшему четному. Метод Round() класса Math реализует именно банковское округление. В качестве параметра он принимает округляемое значение и, возможно, точность, до которой необходимо выполнить округление. Если точность не указана, то округление выполняется до целого.

Случайное округление

Понятно, что если преобладают четные или нечетные числа, то даже банковское округление создаст перекос. В этом случае можно применить, так называемое, случайное округление, когда половина округляется в большую или меньшую сторону по случайному закону. Однако, суммирование одних и тех же данных при таком округлении может давать разные результаты.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34870998
bes385
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот уточнение проблемы:
Тот пример - оказывается был не совсем корректным.
Все округлялось правильно до 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) Подскажите есть ли какие настройки управления типами хранения (может быть они задаются при первоначальном создании БД)

Заранее благодарю.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871021
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не используйте float. Используйте Decimal(10,6)

Результат с флоат будет разный естественно, возможно будет зависеть от процеесора, величины числа и т.д.. Тем более что в 9-ке вообще раунд сделан иначе чем 7-ке.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871025
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис 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)
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871041
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilis..
Просто в твоей фразе "Похоже они решили всегда округлять 5-ку вверх" прозвучал, как мне показалось, упрек в сторону разработчиков, вот я и решил за них заступиться :)
...Боже, нет это был не упрек. Я перечитал документацию по round, не нашел там описания правила по которому округляется. На практике выяснил что используется округление вверх, и написал что написал.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871077
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871138
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bes385Подозреваю что проблема из-за хранения данных типа FLOAT.
Т.е. число 10.950 преобразовывается во FLOAT как 10.949999
Затем после округления получаем 10.9
по-моему float ни при чем
у меня 10.00.UC6 и с float и с decimal 11 получается
Код: plaintext
1.
2.
3.
4.
create procedure TMP_ROUND(A decimal( 10 ,  3 ), B decimal( 10 ,  3 )) returning decimal( 10 ,  3 )
return ROUND(A, B);
end procedure;
execute procedure TMP_ROUND( 10 . 950 ,  1 );
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871144
bes385
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисНе используйте float. Используйте Decimal(10,6)

Результат с флоат будет разный естественно, возможно будет зависеть от процеесора, величины числа и т.д.. Тем более что в 9-ке вообще раунд сделан иначе чем 7-ке.

А вдруг понадобятся значения с 7 или 8 знаками после запятой.
Можешь описать чем отличается раунд в 9 от 7.

И еще - вычитал что есть такой параметр DBFLTMASK который как раз управляет отображением
и по ходу хранением чисел типа FLOAT

Дополнительно: А может быть отличие из-за ОС на серверах? У нас Window у них UNIX.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871255
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bes385Дополнительно: А может быть отличие из-за ОС на серверах? У нас Window у них UNIX.
Именно в этом, а если точнее, то в архитектуре процессора. Денис ведь уже говорил "возможно будет зависеть от процеесора". Это особенность описана в характеристиках типа данных Float (по крайней мере, ранее точно оговаривалось, типа такого (для 7-ки)):
"Количество значащих цифр может изменяться на разных платформах. Для данных этих типов происходит отсечение по последней значащей цифре (данные не округляются).
Поля типа FLOAT не обязательно хранят большие числа; они хранят числа с большей точностью. Для хранения на диске поля типа FLOAT используется 8 байт, а для типа SMALLFLOAT – 4 байта."
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871275
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bes385А вдруг понадобятся значения с 7 или 8 знаками после запятой.
Ну так сделай Dec(30,10) или ту точность, которая тебе нужна.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871277
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В информиксе абсолютно настоящий float :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure flt_test(s integer) returning float;
  define i integer;
  define ret float;
  let ret =  0 ;
  for i =  0  to s
  let ret = ret +  1 / 5 ;
  end for;

  return ret;
end procedure;

Код: plaintext
1.
2.
3.
4.
5.
select flt_test(99)||'' from table(set{1}) 
20,0000000000000000                     

select flt_test(999)||'' from table(set{1}) 
199,9999999999970000                    
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871383
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тан 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
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34871597
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 сек.
...
Рейтинг: 0 / 0
Округление decimal в Infomrix
    #34872102
bes385
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тан
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 по другому работает и только у неё?
Может это бага?
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Округление decimal в Infomrix
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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