Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизФункция 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-й... вылезла др. проблема:
выдает все время 1, Field1 - тип NUMERIC(3,2)...
SELECT (1+Field1/100)
← →
Карелин Артем © (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c