Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция Round в InterBase


KIR ©   (2004-08-19 13:58:00) 

Народ, можно ли как-то округлить число средствами IB?

Ситуация след:

  SELECT
     SUM(DS1.VAL1 * DS1.VAL2)


В результате получается, например, 3.8974, а тебуется 3.90


Карелин Артем   (2004-08-23 11:48:00) [1]

KIR   (20.08.04 19:13) [19]
100(да и 1) видимо интрерпретируется как integer. На sql.ru описывалось такое поведение FB. Кастуй как numeric или пиши 100.00 ........


KIR   (2004-08-20 19:13:00) [2]

Поменял на 3-й... вылезла др. проблема:

SELECT (1+Field1/100)
выдает все время 1, Field1 - тип NUMERIC(3,2)...


KIR   (2004-08-20 15:30:00) [3]

Попробовал на базе с 3-м диалектом - работает... блин... чтож диалект, чтоли менять... у меня таблиц по 150 шт....


Карелин Артем   (2004-08-20 15:14:00) [4]

KIR   (20.08.04 15:11) [15]
У меня 3. Влиять должен.


Карелин Артем   (2004-08-20 15:13:00) [5]

Значит у нас разные версии IB...
Можно хранимую процедуру на округление писать, которая будет умножать на 100, преобразовывать в целое, вычислять разницу между преобразованным и непреобразованным.......
Короче классический алгоритм. Если надо тако - стучи в аську на следующей неделе.
А если идут такие странности с подсчетом, то надо действительно udf юзать.


KIR   (2004-08-20 15:11:00) [6]

Правда, у меня диалект 1, если это влияет...


KIR   (2004-08-20 15:07:00) [7]

К сожалению, негде скриншот выложить, но могу на мэйл кинуть.

У меня 1793,55. Вот сейчас своими гдазами вижу...


Карелин Артем   (2004-08-20 15:01:00) [8]

http://samara.fromru.com/1.jpg


KIR   (2004-08-20 14:56:00) [9]

Карелин Артем ©   (20.08.04 14:28) [11]

Сам-то пробовал сделать, то что предложил?

Результат будет - 1793,55, а надо 1793,5


Карелин Артем   (2004-08-20 14:28:00) [10]

select ( cast( cast(32.61 * 1.1 as numeric(15,2))*50 as numeric(15,2))) from rdb$database


KIR   (2004-08-20 14:23:00) [11]

Карелин Артем ©   (20.08.04 13:24) [9]
Если преобразовать все произведение после суммирования результат будет не тот, например:

32,61 * 1,1 * 50 = 35,871 * 50 = 1793,55

а нужно так:

32,61 * 1,1 * 50 = 35,87* 50 = 1793, 50

Почувствуйте разницу


Карелин Артем   (2004-08-20 13:24:00) [12]

KIR   (19.08.04 17:15) [8]
Преобразовать в NUMERIC надо после суммирования.


KIR   (2004-08-19 17:15:00) [13]

Если делать, как предлагает Артем, нужно писать так:

  SELECT
     SUM(VAL1 * CAST((VAL2 * VAL3) AS NUMERIC(10,2))

Не проходит...

Да и бог с ним. Я уже в UDF уперся... Не мойму, что не так?


Zacho   (2004-08-19 17:11:00) [14]


>KIR   (19.08.04 16:35) [5]
>Вариант Артема не поможет. У меня след. ситуация:
>
>SELECT
>     SUM(DS1.VAL3 * ROUND(DS1.VAL1 * DS1.VAL2))

Поможет, поможет. Ты попробуй


KIR   (2004-08-19 16:56:00) [15]

Функция:

library my_udfs;

uses
SysUtils, Math;

function RoundVal(var Val: Single; var Ost: Integer): Single; cdecl; export;
begin
 Result := RoundTo(Val,Ost);
end;

exports
 RoundVal;

end.

Декларация UDF:

DECLARE EXTERNAL FUNCTION ROUND
  FLOAT,
  INTEGER
RETURNS FLOAT BY VALUE
ENTRY_POINT 'RoundVal' MODULE_NAME 'my_udfs.dll'

Снова возвращает 0...
Что-то опять делаю не так...


KIR   (2004-08-19 16:35:00) [16]

Вариант Артема не поможет. У меня след. ситуация:

SELECT
    SUM(DS1.VAL3 * ROUND(DS1.VAL1 * DS1.VAL2))


jack128   (2004-08-19 16:15:00) [17]


> DECLARE EXTERNAL FUNCTION ROUND
>    NUMERIC(15,15),
>    INTEGER
> RETURNS NUMERIC(15,15) BY VALUE
> ENTRY_POINT 'RoundVal' MODULE_NAME 'my_udfs.dll'
Откуда нумерики на входе и на выходе взялись если у тя в удф - Extended ? Кстати IB такого типа вообще не знает

А вообще Артёма слушай - он дело говорит.


KIR   (2004-08-19 16:05:00) [18]

Функция:

library bms_udfs;

uses
 SysUtils, Math;

function RoundVal(var Val: Extended; var Ost: Integer): Extended; cdecl; export;
begin
  Result := RoundTo(Val,Ost);
end;

exports
  RoundVal;

end.


Декларация UDF:

DECLARE EXTERNAL FUNCTION ROUND
   NUMERIC(15,15),
   INTEGER
RETURNS NUMERIC(15,15) BY VALUE
ENTRY_POINT 'RoundVal' MODULE_NAME 'my_udfs.dll'


Возвращает почему-то 0
Что делаю не так?


Карелин Артем   (2004-08-19 14:07:00) [19]

SELECT (cast (SUM(DS1.VAL1 * DS1.VAL2) as NUMERIC(10,2))) from rdb$database


jack128   (2004-08-19 13:59:00) [20]

UDF подключить...


Наверх

Титульная страница Поиск, карта сайта Написать письмо