Я пытался ответить на этот ТАК вопрос ..
Учитывая следующий код TSQL
DECLARE @input1 INT = 100000
DECLARE @input2 INT = 40
DECLARE @input3 INT = 106833
DECLARE @X decimal(22,6) = 0
DECLARE @Y decimal(22,6) = 0.001
DECLARE @Z decimal(22,6)
DECLARE @r decimal(22,6)
DECLARE @v decimal(22,6)
SET @v = POWER(1/(1+ (@Y/12)), @input2)
SET @r = ((@Y/@input2) * @input1) / (1-@v)
IF (@r < @input3)
SET @Z = @Y + ABS((@X - @Y)/2)
ELSE
SET @Z = @Y - ABS((@X - @Y) /2)
SET @X = @Y
SET @Y = @Z
WHILE (ABS(@r - @input3) > 0.001)
BEGIN
SET @v = POWER(1/(1+ (@Y/12)), @input2)
SET @r = ((@Y/@input2) * @input1) / (1-@v)
IF (@r < @input3)
SET @Z = @Y + ABS((@X - @Y)/2)
ELSE
SET @Z = @Y - ABS((@X - @Y) /2)
SET @X = @Y
IF @Y = @Z
BREAK
SET @Y = @Z
END
SELECT (CAST(@Y AS decimal(22,6)) * 100)
Я пытался преобразовать его в C #
decimal input1 = 100000m;
decimal input2 = 40m;
decimal input3 = 106833m;
decimal x = 0m;
decimal y = 0.001m;
decimal z;
decimal r;
decimal v;
v = (decimal)(Math.Pow(Convert.ToDouble(1m / (1m + (y / 12m))), Convert.ToDouble(input2)));
r = ((y / input2) * input1) / (1 - v);
if (r<input3)
{
z = y + Math.Abs((x - y) / 2);
}
else
{
z = y - Math.Abs((x - y) / 2);
}
x = y;
y = z;
while (Math.Abs(r - input3) > 0.001m)
{
v = (decimal)(Math.Pow(Convert.ToDouble(1 / (1 + (y / 12))), Convert.ToDouble(input2)));
r = ((y / input2) * input1) / (1 - v);
if (r<input3)
{
z = y + Math.Abs((x - y) / 2);
}
else
{
z = y - Math.Abs((x - y) / 2);
}
x = y;
if (y==z) break;
y = z;
}
Console.WriteLine(y*100);
Но результаты разные.
TSQL возвращает 4273.320000, тогда как код C # возвращает 0,1999999999999999999999998900. Кроме того, если я помещаю точно такой же код C # в SqlFunction (функция CLR) через
[Microsoft.SqlServer.Server.SqlFunction]
public static decimal CalcFinancialSpreading(decimal input1 = 100000, decimal input2 = 40, decimal input3 = 106833)
, он возвращает 0
Кто-нибудь обнаружил ошибку?