Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
DB2 v8 Есть функция: имя(параметры) RETURNS numeric(5, 2) В ней объявлены параметры: DECLARE totalScore DOUBLE default 0; DECLARE counter INTEGER default 0; В конце есть такое: return round((totalScore/counter), 2); При totalScore=12.1 и counter=4 ф-ция возвращает 3,02. Хотя 12.1/4=3.025 и при округлении должно быть 3,03. Вычисляем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Есть идея поменять тип переменной totalScore с double на real, но мне бы всё-таки хотелось понять причины такого странного поведения. Заранее благодарю за подсказки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 18:52 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
"Хотя 12.1/4=3.025 и при округлении должно быть 3,03." Вы уверены? Округления, они разные бывают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 10:24 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
Ivan Ivanich, http://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 10:25 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
Ivan Ivanich"Хотя 12.1/4=3.025 и при округлении должно быть 3,03." Вы уверены? Округления, они разные бывают. У вас есть ещё какие-либо комментарии, кроме констатации факт о том, что существуют разные виды округления? Например, почему в случае double и real применяются разные округления? Я полагаю, это было бы более полезно, чем мериться датами, когда мы впервые узнали об этом занимательном факте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 11:40 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
mwolfУ вас есть ещё какие-либо комментарии, кроме констатации факт о том, что существуют разные виды округления? Например, почему в случае double и real применяются разные округления? Я просто подумал, что Вы не знаете об этом факте, вот и удивляетесь. Если знаете, хорошо. Давайте поищем в мануалах вместе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 11:53 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
mwolfDB2 v8 Есть функция: имя(параметры) RETURNS numeric(5, 2) В ней объявлены параметры: DECLARE totalScore DOUBLE default 0; DECLARE counter INTEGER default 0; В конце есть такое: return round((totalScore/counter), 2); При totalScore=12.1 и counter=4 ф-ция возвращает 3,02. Хотя 12.1/4=3.025 и при округлении должно быть 3,03. Есть идея поменять тип переменной totalScore с double на real, но мне бы всё-таки хотелось понять причины такого странного поведения. Заранее благодарю за подсказкиБагофича это какая-то... Если у вас надо получить numeric(5, 2), то используйте: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 12:09 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
round((cast(12.1 as decimal(5,2))/ 4), 2) as a5 --округление decimal тоже дал 3.03 на той же версии базы. отличается только от всех типов только округление double ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 12:29 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
Ответ в формате хранения числа в real и dooble. Вкраце: число представлено ввиде показателя (степени) 2 и мантиссы - двоичной дроби. Мантиссу нормализуют - за счет показателя добиваются, чтобы она начиналась с 1 и берут эту 1 "на ум". Это обеспечивает хранение 15-16 (для double) значащих цифр. При таком подходе целая часть числа (в пределах значащих цифр) хранится точно, а вот дробные не зависимо от числа цифр - УВЫ не всегда. Например: 0.1 вы не сможете представить в виде суммы A1/2 + A2/4 + A3/8+ ... + An/2^n, где n-длина мантиссы в битах (для double n=53 или 54 точно не помню) и Ai = (0 или 1). Поэтому вы делите на самом деле не 12.1, а что-то типа 12.09999...986 и соответственно в результате имеете 3.024999... ЗЫ. Никогда не храните деньги в double / real. Или храните их в копейках / сантимах / центах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 15:45 |
|
||
|
Округление real vs double
|
|||
|---|---|---|---|
|
#18+
Спасибо всем ответившим. В качестве решения буду кастить double во что-то приемлимое, скорее всего в numeric(5,3). В ходе экспериментов выяснилось, что причина в том, что double зверски хранит числа. Не то, чтобы я этого не знал, просто не думал, что всё настолько плохо. В качестве примера "багофич" пару результатов ф-ций: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Ещё раз всем спасибо. З.Ы. Хотя что произошло с округлением я так и не понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 16:36 |
|
||
|
|

start [/forum/topic.php?fid=43&tid=1602458]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
89ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 203ms |

| 0 / 0 |
