powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / round & numeric & float
8 сообщений из 8, страница 1 из 1
round & numeric & float
    #34163150
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно вот:

PG по умолчанию константы с точкой в нумерик приводит
Код: plaintext
1.
2.
3.
4.
5.
select round( 5 . 5 ); --6
select round( 4 . 5 ); --5

select round( 5 . 5 ::float); --6
select round( 4 . 5 ::float); --4

-
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217
Если бы бухгалтер был магом и чародеем, он несомненно решил бы проблему так, чтобы какой-нибудь
саблезубый тигр откусил руку, или хотя бы нечетное количество пальцев нашему волосатому пращуру,
придумавшему десятичную систему счисления, чтобы в ней не осталось "середины".
Но он выкрутился хитрее — половину отбрасываемых пятерок стал округлять вверх,
а половину — вниз. Чтобы его не обвинили в личных пристрастиях, критерием стала цифра перед
пятеркой — если она четная, то округление вниз, иначе вверх. Это правило и называется правилом "Бухгалтерского"
(или "Банковского") округления.

Там-же :
Третьи говорили, что это баг от Microsoft, или глюк всех Pentium-ов (или AMD, в зависимости от личных пристрастий).
Поэтому хотелось бы знать, существует ли некий общепринятый документ относительно способов округления.
И такой документ действительно существует. Это знаменитый стандарт IEEE 754.



з.ы. это было как валенком по башек для меня..
...
Рейтинг: 0 / 0
round & numeric & float
    #34163528
т.е. для правильного мат. округления надо все равно сначала привести к нумерику, а сталобыть достаточно писать через приведение к нумерику и взад, а не пользоваться раундом?
select t.field::numeric(12,2)::float FROM t;

кстати я так и не понял, как получить разницу меж двумя величинами разных типов. при попытке ее вычислить нумерик проведется к флоату, и разницы не будет. какой-то ф-ии типа приведения float к строке с заданной точностью кажется нет. каст float-a к ньюмерику произвольного типа тоже не дает "значащих цифирей".
единственно можно нащупать разницу на преобразованиях туда-обратно
Код: plaintext
1.
2.
3.
4.
5.
SELECT
 4 . 5 ::float::numeric( 19 , 16 )
, 4 . 494999999999995 ::FLOAT::NUMERIC( 10 , 2 )
, 4 . 494999999999996 ::FLOAT::NUMERIC( 10 , 2 )
---
  4 . 5000000000000000 ; 4 . 49 ; 4 . 50 
...
Рейтинг: 0 / 0
round & numeric & float
    #34163781
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну видимо да..или перевести всю бд с флоута на нумерик, но все-равно это как-то все не красиво...
...
Рейтинг: 0 / 0
round & numeric & float
    #34168887
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не даром за место устаревшего 'money' в постгресе предлагают использовать numeric а не float. И вообще, float - это одна из главных и наибольших "засад" начинающего программиста. Его ж даже сравнивать в принципе нельзя! Так что "перевести всю бд с флоута на нумерик" не такая уж и ужасная идея (хотя, это смотря какая база) - с float мучиться придеться больше.
...
Рейтинг: 0 / 0
round & numeric & float
    #34169734
JelisТак что "перевести всю бд с флоута на нумерик" не такая уж и ужасная идея (хотя, это смотря какая база) - с float мучиться придеться больше.кажецца сильно потеряем в скорости арифметики (агрегирования). т.ч. можно оставить флоаты, но затригеренные по бефоре (типо каст к нужной точности нумерика). и с раундом (если потербуется), переопределенным через каст в ньюмерик. Вопрос: можно ли единожды создать свой тип из флоата, определив, что он перед соханением должен каститься в ньюмерик с нужным числом знаков на хвосте, (и взад на автомате) (и переопределив round для него)?


JelisИ вообще, float - это одна из главных и наибольших "засад" начинающего программиста. Его ж даже сравнивать в принципе нельзя! опять таки, если не свободен в выборе компонентов для типа (я например перегоняю данные из/через аксесс - юзая ODBC) то засад несколько больше. например если обновлять запись из интерморды акса, имеющую поля с типом timestamp(tz), то велика вероятность напороться на сообщение "запись изменена другим пользоваетем") которая проистекает из того, что реальный запрос на апдейт уходит с перечислением значений всех полученных полей в WHERE, а точность данных в аксесовском DATE/TIME (реально -это float8) много меньше точности в timestampe, и искомая строка для обновления не находится сервером. Приходится пользовать на стороне pg тип abstime для дат и времени (якобы устаревший) или перед сохранением в timestampt заранее огрублять его в триггере BEFORE UPDATE (new.timefield = new.timefield::abstime) - чтобы сравнение давало "совпадение" строк. Т.я. флоаты то как раз сравниваются, а вот флаты с более точными - нет (или надо пририсовывать правило нечеткого сравнения типов в ODBC-ю).
...
Рейтинг: 0 / 0
round & numeric & float
    #34170129
romand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
round & numeric & float
    #34171433
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiiiiiiiiiiiiiiiiiii что реальный запрос на апдейт уходит с перечислением значений всех полученных полей в WHERE
А в Аксессе нельзя сделать что бы update только по id был?
...
Рейтинг: 0 / 0
round & numeric & float
    #34171570
iiiiiiiiiiiiiii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jelis iiiiiiiiiiiiiiiiiiii что реальный запрос на апдейт уходит с перечислением значений всех полученных полей в WHERE
А в Аксессе нельзя сделать что бы update только по id был?
самому (скажем из кода) послать серверу апдейт по ключу можно и вообще любой правильный апдейт.

речь именно об апдейте, посылаемом (самостийно) аксом из стандартной аксовской формы, связанной с данными на основе привязанной по одбс табличке. А в нее он отылает перечень всех полей. Что, с его т.з, "правильно" - ить другой усер мог поменять данные, а тады ой.

а из свободной формы генери какие хошь апдейты. и шли. речь то об том, чтобы не переписывать стандартный функционал врукопашку.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / round & numeric & float
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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