powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ЧЮдеса с ROUND/DOUBLE'ами или...
24 сообщений из 24, страница 1 из 1
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33354258
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или я что-то туплю...


# 1
Код: plaintext
1.
2.
3.
4.
5.
select ROUND(PRICE*ROUND(M3, 3 ), 2 ) from t.di_data where id_di =  161 

 1                     
------------------------
  + 2 ,45290000000000E+ 002 
#2
Код: plaintext
1.
2.
3.
4.
5.
select ROUND(PRICE*ROUND(M3, 3 ), 3 ) from t.di_data where id_di =  161 

 1                    
------------------------
  + 2 ,45295000000000E+ 002 

#3
Код: plaintext
1.
2.
3.
4.
5.
select ROUND(ROUND(PRICE*ROUND(M3, 3 ), 3 ), 2 )  from t.di_data where id_di =  161 

 1                      
------------------------
  + 2 ,45300000000000E+ 002 


#1 = 245,29 (+2,45290000000000E+002) ROUND(value,2)
#2 = 245,295 (+2,45295000000000E+002) ROUND(value,3)
#3 = 245,30 (+2,45300000000000E+002) ROUND(ROUND(value,3),2)


P.S.
поля "PRICE","M3" - DOUBLE
DB2/NT 8.2.3 32bit
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33354265
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вроде так и должно быть ежели value типа 245,2946
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355202
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держать деньги в double - грубая ошибка. Даже как-то странно видеть людей, которые до сих пор этого не знают.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355807
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
туплю...
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355821
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor MetelitsaДержать деньги в double - грубая ошибка. Даже как-то странно видеть людей, которые до сих пор этого не знают.
В чем грубая ошибка, соизволите сказать или ссылочку?
Для тех кто до сих пор не знает...
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355880
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать даблы для денег, то неизбежно возникнут ошибки округления. Т.е. баланс не сойдется.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355951
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanЕсли использовать даблы для денег, то неизбежно возникнут ошибки округления. Т.е. баланс не сойдется.
А что же тогда использовать? DECIMAL/NUMERIC? Т.е. числа с implicit decimal point?
А если мне нужно 10 цифр после запятой (например),
то c DECIMAL(15,10) проблем c округлением не будет что-ли?
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355977
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skaДа вроде так и должно быть ежели value типа 245,2946

Код: plaintext
1.
2.
3.
4.
5.
select ROUND(PRICE*ROUND(M3, 3 ), 5 ),PRICE,M3 from t.di_data where id_di =  161 

 1                         PRICE                    M3                      
------------------------ ------------------------ ------------------------
  + 2 ,45295000000000E+ 002    + 7 ,90000000000000E+ 001    + 3 ,10500000000000E+ 000 
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33355994
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Herr Developerтуплю...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select ROUND(PRICE*ROUND(M3, 3 ), 5 ),PRICE,M3 from t.di_data where id_di =  161 

 1                         PRICE                    M3                      
------------------------ ------------------------ ------------------------
  + 2 ,45295000000000E+ 002    + 7 ,90000000000000E+ 001    + 3 ,10500000000000E+ 000 

   1  record(s) selected.


select ROUND(PRICE*ROUND(M3, 3 ), 2 ),PRICE,M3 from t.di_data where id_di =  161 

 1                         PRICE                    M3                      
------------------------ ------------------------ ------------------------
  + 2 ,45290000000000E+ 002    + 7 ,90000000000000E+ 001    + 3 ,10500000000000E+ 000 

   1  record(s) selected.

Вы нестесняйтесь, скажите где я торможу.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33356204
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот здесь:
Код: plaintext
1.
 2 ,45290000000000E+ 002    =  245 . 29  
проблемы? Чем не устраивает?

double всегда тока мантису отображает...

попробуй лучше так
Код: plaintext
1.
2.
values cast( round(cast( 12345 . 6789  as double), 2 ) as dec( 17 , 2 ))
values round(cast( 12345 . 6789  as double), 2 )


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
db2 => values cast( round(cast( 12345 . 6789  as double), 2 ) as dec( 17 , 2 ))

 1 
-------------------
            12345 , 68 

   1  record(s) selected.

db2 => values round(cast( 12345 . 6789  as double), 2 )

 1 
------------------------
  + 1 ,23456800000000E+ 004 

   1  record(s) selected.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33356235
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanвот здесь:
Код: plaintext
1.
 2 ,45290000000000E+ 002    =  245 . 29  
проблемы? Чем не устраивает?

double всегда тока мантису отображает...

[/src]
Как отображает мне по-барабану.
Мне не понятно следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
db2 => create table t ( price double,m3 double )
DB20000I  The SQL command completed successfully.
db2 => insert into t values ( 79 , 3 . 105 )
DB20000I  The SQL command completed successfully.
db2 => select price*m3 from t

 1 
------------------------
  + 2 .45295000000000E+ 002 

   1  record(s) selected.

db2 => select ROUND(price*m3, 2 ) from t

 1 
------------------------
  + 2 .45290000000000E+ 002 

   1  record(s) selected.

db2 => select ROUND( cast(price*m3 as dec( 17 , 10 )), 2 ) from t

 1 
--------------------
       245 . 3000000000 

   1  record(s) selected.
Где я туплю????
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33356438
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Herr Developer db2 => insert into t values (79,3.105)

Десятичные дроби в DOUBLE представляются не точно!
Поэтому твое 3.105 будет хранится что-то типа 3.104999...658.
Ошибка может выползти в значимую область (например три цифры после запятой) при умножении или многократном сложении (это про расхождение баланса).
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33356440
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще - если Round() участвует в арифметическом выражении с double, то он снова становится double.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33356726
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деньги в копейках хранить надо или в numeric(x,2) - что в общем-то одно и тоже. В таком случае - десять цифр после запятой вам не понадобятся никогда.
все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33357801
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsa
Десятичные дроби в DOUBLE представляются не точно!
Поэтому твое 3.105 будет хранится что-то типа 3.104999...658.

Прикольно.
Это типа "как хотим так и храним".

golsa
Ошибка может выползти в значимую область (например три цифры после запятой) при умножении или многократном сложении (это про расхождение баланса).

Что из-этого может выйти, ну да... что-угодно...
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33357809
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsaИ еще - если Round() участвует в арифметическом выражении с double, то он снова становится double.
Да, ROUND возращает тот-же тип.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33357828
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldДеньги в копейках хранить надо или в numeric(x,2) - что в общем-то одно и тоже. В таком случае - десять цифр после запятой вам не понадобятся никогда.
все наши на www.corba.kubsu.ru
"Деньги в копейках хранить" ничего не дадут, экономия получиться в 2 знака.
И в "или в numeric(x,2)" не залезит 1,212125474 $, например.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358057
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsa
Поэтому твое 3.105 будет хранится что-то типа 3.104999...658.

Странно что в языках таких проблем ненаблюдалось (C#,Java)...
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358338
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я если честно не могу понять вашей проблемы. Если вы работаетет с деньгами, то храните в копейках, результат операций округляете до копейки. Дробные копейки вам принципиально не нужны, вернее если вдруг они вам стали нужны - значит где-то ошибка в самом алгоритме.
Лучше опишите задачу, где вам понадобились суммы меньши копейки.
все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358343
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я если честно не могу понять вашей проблемы. Если вы работаетет с деньгами, то храните в копейках, результат операций округляете до копейки. Дробные копейки вам принципиально не нужны, вернее если вдруг они вам стали нужны - значит где-то ошибка в самом алгоритме.
Лучше опишите задачу, где вам понадобились суммы меньши копейки.
все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358460
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldЯ если честно не могу понять вашей проблемы. Если вы работаетет с деньгами, то храните в копейках, результат операций округляете до копейки. Дробные копейки вам принципиально не нужны, вернее если вдруг они вам стали нужны - значит где-то ошибка в самом алгоритме.
Лучше опишите задачу, где вам понадобились суммы меньши копейки.
все наши на www.corba.kubsu.ru
Проблема с ROUND/DOUBLE (или мной) :-)

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

Или Вы думаете что все должно стоить (имеет цену) как минимум 1 копейку, и не меньше?!
:-)
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358585
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://docs.sun.com/app/docs/doc/800-7895/6hos0aou8?a=view
OK. Все встало на свои места.
Спасибо Всем ответившим.

Тема закрыта.
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33358999
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Herr Developer Странно что в языках таких проблем ненаблюдалось (C#,Java)
Ошибаетесь, дорогой, там теже самые проблемы для типов real, double, extendet - это определяется способом хранения - двоичной мантиссой.

Сопроцессор на компе работает именно с таким представлением данных - так что этот факт отлит в "железе".
...
Рейтинг: 0 / 0
ЧЮдеса с ROUND/DOUBLE'ами или...
    #33360445
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsa
Ошибаетесь, дорогой, там теже самые проблемы для типов real, double, extendet - это определяется способом хранения - двоичной мантиссой.

Сопроцессор на компе работает именно с таким представлением данных - так что этот факт отлит в "железе".

Я же говорю

Herr Developer
http://docs.sun.com/app/docs/doc/800-7895/6hos0aou8?a=view
OK. Все встало на свои места.



Спасибо ;-)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ЧЮдеса с ROUND/DOUBLE'ами или...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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