![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция 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-й... вылезла др. проблема:
выдает все время 1, Field1 - тип NUMERIC(3,2)...
SELECT (1+Field1/100)
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 подключить...