Угу, кажется есть свет в конце тоннеля. Если кому интересно, вот вам две функции. Первая постороена, как я уже говорил, по лекалам Никиты Зимина (еще раз спасибо!), вторая - результат размышлений. Первая работает без потери точности, вторая теряет последние два знака после запятой. Ну, два - не двенадцать. С учетом того, что от нас требуют 14 знаков, можно сказать, что проблема решена. Если, конечно, не обращать внимание на быстродействие.
Но неужели нет возможности избежать этих танцев с бубнами?! Я по-прежнему буду рад любым альтернативным мнениям.
CREATE FUNCTION dbo.calc_Multiply
( @x DECIMAL (38,18)
, @y DECIMAL (38,18)
)
RETURNS DECIMAL (38,18)
AS
BEGIN
DECLARE @a DECIMAL(18,0)
, @b DECIMAL(18,18)
, @c DECIMAL(18,0)
, @d DECIMAL(18,18)
, @RES DECIMAL(38,18)
;
SET @a = ROUND(@x, 0, 1)
SET @c = ROUND(@y, 0, 1)
SET @b = @x - @a
SET @d = @y - @c
SELECT @RES = CAST(@a * @c AS numeric(38,18))
+ CAST(@a * @d AS numeric(38,18))
+ CAST(@b * @c AS numeric(38,18))
+ CAST(@b * @d AS numeric(38,18))
RETURN @RES
END
GO
CREATE FUNCTION dbo.calc_Divide
( @x DECIMAL (38,18)
, @y DECIMAL (38,18)
)
RETURNS DECIMAL (38,18)
AS
BEGIN
DECLARE @x1 DECIMAL(38,6)
, @cff DECIMAL(1,1)
, @R1 DECIMAL(38,6)
, @RES DECIMAL(38,18)
SET @cff = 0.1
SET @x1 = @x * 1000000000000
SET @R1 = @x1 / @y
SET @RES = CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST ( CAST (
@R1 * @cff AS DECIMAL(38,7))
* @cff AS DECIMAL(38,8))
* @cff AS DECIMAL(38,9))
* @cff AS DECIMAL(38,10))
* @cff AS DECIMAL(38,11))
* @cff AS DECIMAL(38,12))
* @cff AS DECIMAL(38,13))
* @cff AS DECIMAL(38,14))
* @cff AS DECIMAL(38,15))
* @cff AS DECIMAL(38,16))
* @cff AS DECIMAL(38,17))
* @cff AS DECIMAL(38,18))
RETURN @RES
END
GO