Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

Функция Round в InterBase   Найти похожие ветки 

 
KIR   (2004-08-19 13:58) [0]

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

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

  SELECT
     SUM(DS1.VAL1 * DS1.VAL2)


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


 
jack128 ©   (2004-08-19 13:59) [1]

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


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

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


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

Функция:

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
Что делаю не так?


 
jack128 ©   (2004-08-19 16:15) [4]


> 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:35) [5]

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

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


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

Функция:

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...
Что-то опять делаю не так...


 
Zacho ©   (2004-08-19 17:11) [7]


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

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


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

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

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

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

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


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

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


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

Карелин Артем ©   (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 14:28) [11]

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


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

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

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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
9-1085236633
Knight
2004-05-22 18:37
2004.09.19
У кого есть подборка исходников или алгоритмов для отрисовки...


14-1093852029
GRAND25
2004-08-30 11:47
2004.09.19
Конкурс футбольных прогнозистов Лиги Чемпионов сезона 2004/2005


3-1092913938
V-A-V
2004-08-19 15:12
2004.09.19
Контейнер для хранения тексов SQL запросов


3-1092898407
AndrewS
2004-08-19 10:53
2004.09.19
Доступ из Delphi к описаниям полей


4-1092043138
Анатолий
2004-08-09 13:18
2004.09.19
Автогенерация в текущем десктопе.