Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
22.06.2017, 10:15
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Добрый день. Помогите, пожалуйста, правильно округлить. Сервер 2.5, диалект 3 select cast(27043022.5 as double precision) / cast(100 as double precision) from rdb$database получаем результат 270430.224999999977 , при математическом округлении на 2 знаков после запятой получаем 270430.22, а нужно 270430.23 . ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:27
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Luke221, не понятно по каким критериям вы хотите округлить. Как сервер поймёт это? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:27
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Luke221, В FB2.5 есть встроенная функция ROUND (number [, scale]). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:32
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Когда-то заморачивался округлением вверх на сервере, родил вот такую процедуру. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:38
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Как вариант: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:41
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Симонов ДенисLuke221, не понятно по каким критериям вы хотите округлить. Как сервер поймёт это? Есть 2 числа 27043022.5 и 100. При делении первого на второе результат 270430.225 , при округлении до 2 знаков после запятой получается 270430.23 Что делает Firebird: select round(cast(27043022.5 as double precision) / cast(100 as double precision), 2) from rdb$database Результат: 270430.22000000003 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:43
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
rdb_devКак вариант: Код: sql 1.
первое число - переменная, костылик +0.5 не прокатит для любых чисел ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:46
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Luke221, fraks никакое округление вверх тут не поможет. Проблема автора в использовании типов с плавающей точкой ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:47
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
fraksLuke221, В FB2.5 есть встроенная функция ROUND (number [, scale]). round как раз правильно работает, именно поэтому я и не упомянул. Неверный результат получается как раз при делении на 100 из-за особенностей Firebird с 9999999 в периоде ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:49
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Luke221первое число - переменная, костылик +0.5 не прокатит для любых чиселЧой-то не прокатит? Тебе же сначала надо округлить до целого, а только затем делить на 100? Дополнение на 0.5, с последующим отбрасыванием дробной части, очень даже прокатит, если при попадании в половину целого тебе надо округлять в большую сторону, а не в зависимости от четности/нечетности целого! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:58
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
rdb_devLuke221первое число - переменная, костылик +0.5 не прокатит для любых чиселЧой-то не прокатит? Тебе же сначала надо округлить до целого, а только затем делить на 100? Дополнение на 0.5, с последующим отбрасыванием дробной части, очень даже прокатит, если при попадании в половину целого тебе надо округлять в большую сторону, а не в зависимости от четности/нечетности целого! не совсем... ваш метод: SELECT Floor(Cast(27043022.55 as double precision) + 0.5) / cast(100.0 as double precision) FROM RDB$DATABASE дает 270430.23 а нужно: 27043022.55 / 100 = 270430.2255 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:58
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Luke221Неверный результат получается как раз при делении на 100 из-за особенностей Firebird с 9999999 в периодеRTFM double precision ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 10:59
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Luke221rdb_devпропущено... Чой-то не прокатит? Тебе же сначала надо округлить до целого, а только затем делить на 100? Дополнение на 0.5, с последующим отбрасыванием дробной части, очень даже прокатит, если при попадании в половину целого тебе надо округлять в большую сторону, а не в зависимости от четности/нечетности целого! не совсем... ваш метод: SELECT Floor(Cast(27043022.55 as double precision) + 0.5) / cast(100.0 as double precision) FROM RDB$DATABASE дает 270430.23 а нужно: 27043022.55 / 100 = 270430.2255 Тут я уже напутал) Результат при округлении до 2 знаков как раз 270430.23 p.s.> вроде прокатывает ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 11:03
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Luke221а нужно: 27043022.55 / 100 = 270430.2255 никак такое не получится, потому что по нормальному выходит select cast(27043022.5 as numeric(18,2)) / cast(100 as numeric(18,2)) from rdb$database 270430,2250 откуда из 270430.224999999977 в 4м разряде после запятой получится 5 - непонятно. Читать http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 и http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 11:21
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
kdvLuke221а нужно: 27043022.55 / 100 = 270430.2255 никак такое не получится, потому что по нормальному выходит select cast(27043022.5 as numeric(18,2)) / cast(100 as numeric(18,2)) from rdb$database 270430,2250 откуда из 270430.224999999977 в 4м разряде после запятой получится 5 - непонятно. Читать http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 и http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217 потому что в моем 2 примере select cast(27043022.55 as numeric(18,2)) / cast(100 as numeric(18,2)) from rdb$database ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 11:28
|
|||
---|---|---|---|
Округление :| |
|||
#18+
Luke221, да пофиг. читайте те 2 статьи. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 11:46
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Luke221, ещё раз повторяю проблема в использовании типов с плавающей точкой. Ну не возможно работать с double precision без ошибок округления. Поэтому пока вариант только один переходить на фиксированную точку. Выйдет 4.0 там можно развлекаться с DECFLOAT ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 11:56
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Симонов ДенисLuke221, ещё раз повторяю проблема в использовании типов с плавающей точкой. Ну не возможно работать с double precision без ошибок округления. Поэтому пока вариант только один переходить на фиксированную точку. Выйдет 4.0 там можно развлекаться с DECFLOAT Проблема с фиксированной точкой другая - переполнение при умножении (там на самом деле сложнее формула) kdvLuke221, да пофиг. читайте те 2 статьи. Спасибо за статьи rdb_devКак вариант: Код: sql 1.
Спасибо. Ваш метод и правда работает! select round(round(cast(27043022.5 as double precision), 0) / cast(100 as double precision), 2) from rdb$database ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 13:09
|
|||
---|---|---|---|
Округление :| |
|||
#18+
round(:value + 0.00001, 2) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
22.06.2017, 13:33
|
|||
---|---|---|---|
|
|||
Округление :| |
|||
#18+
Luke221Проблема с фиксированной точкой другая - переполнение при умножении (там на самом деле сложнее формула) Значит на самом деле тебе не надо маяться дурью с плавающей точкой, а тщательно, согласно бизнес-правилам, расставить приведение промежуточных результатов в этой формуле. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=40&tablet=1&tid=1561522]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 278ms |
0 / 0 |