|
Округление :|
|
|||
---|---|---|---|
#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:15 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221, не понятно по каким критериям вы хотите округлить. Как сервер поймёт это? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:27 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221, В FB2.5 есть встроенная функция ROUND (number [, scale]). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:27 |
|
Округление :|
|
|||
---|---|---|---|
#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:32 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Как вариант: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:38 |
|
Округление :|
|
|||
---|---|---|---|
#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:41 |
|
Округление :|
|
|||
---|---|---|---|
#18+
rdb_devКак вариант: Код: sql 1.
первое число - переменная, костылик +0.5 не прокатит для любых чисел ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:43 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221, fraks никакое округление вверх тут не поможет. Проблема автора в использовании типов с плавающей точкой ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:46 |
|
Округление :|
|
|||
---|---|---|---|
#18+
fraksLuke221, В FB2.5 есть встроенная функция ROUND (number [, scale]). round как раз правильно работает, именно поэтому я и не упомянул. Неверный результат получается как раз при делении на 100 из-за особенностей Firebird с 9999999 в периоде ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:47 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221первое число - переменная, костылик +0.5 не прокатит для любых чиселЧой-то не прокатит? Тебе же сначала надо округлить до целого, а только затем делить на 100? Дополнение на 0.5, с последующим отбрасыванием дробной части, очень даже прокатит, если при попадании в половину целого тебе надо округлять в большую сторону, а не в зависимости от четности/нечетности целого! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 10:49 |
|
Округление :|
|
|||
---|---|---|---|
#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:58 |
|
Округление :|
|
|||
---|---|---|---|
#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, 10:59 |
|
Округление :|
|
|||
---|---|---|---|
#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:03 |
|
Округление :|
|
|||
---|---|---|---|
#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:21 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221, да пофиг. читайте те 2 статьи. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 11:28 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221, ещё раз повторяю проблема в использовании типов с плавающей точкой. Ну не возможно работать с double precision без ошибок округления. Поэтому пока вариант только один переходить на фиксированную точку. Выйдет 4.0 там можно развлекаться с DECFLOAT ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 11:46 |
|
Округление :|
|
|||
---|---|---|---|
#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, 11:56 |
|
Округление :|
|
|||
---|---|---|---|
#18+
round(:value + 0.00001, 2) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 13:09 |
|
Округление :|
|
|||
---|---|---|---|
#18+
Luke221Проблема с фиксированной точкой другая - переполнение при умножении (там на самом деле сложнее формула) Значит на самом деле тебе не надо маяться дурью с плавающей точкой, а тщательно, согласно бизнес-правилам, расставить приведение промежуточных результатов в этой формуле. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2017, 13:33 |
|
|
start [/forum/topic.php?fid=40&fpage=43&tid=1561522]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 295ms |
total: | 431ms |
0 / 0 |