IRR 计算中的 SQL 浮点错误

问题描述 投票:0回答:2

我有一个同事写了一个 IRR 计算函数。您提供似乎是一组现金流量,它会返回 IRR。 99% 的情况下它都能工作,但有时我会遇到浮点错误。我试图找出代码中可能发生的情况。 该函数如下所示:

CREATE FUNCTION [dbo].[CalcXIRR]
(
    @Sample XIRRTable READONLY,
    @Rate FLOAT = 0.1
)
RETURNS DECIMAL(38, 9)
AS
BEGIN

    DECLARE @X FLOAT = 0.0,
    @X0 FLOAT = 0.1,
    @f FLOAT = 0.0,
    @fbar FLOAT = 0.0,
    @i TINYINT = 0,
    @found TINYINT = 0

    IF @Rate IS NULL
        SET @Rate = 0.1

    SET @X0 = @Rate

    WHILE @i < 100
    BEGIN

        SELECT  @f = 0.0, 
                @fbar = 0.0

        SELECT  @f = @f + value * POWER(1 + @X0, (-theDelta / 365.0E)),
                @fbar = @fbar - theDelta / 365.0E * value * POWER(1 + @X0, (-theDelta / 365.0E - 1))
        
        FROM    
        (
            SELECT  Value,
                    DATEDIFF(DAY, MIN(date) OVER (), date) AS theDelta

            FROM    @Sample

        ) AS d

        SET @X = @X0 - @f / @fbar

        IF ABS(@X - @X0) < 0.00000001
        BEGIN
            SET @found = 1
            BREAK;
        END

        SET @X0 = @X
        SET @i += 1

    END

    IF @found = 1
        RETURN  @X

    RETURN NULL
END
GO

您向其提供如下所示的数据:

Date                     Value
2017-08-01 00:00:00.000 -3775585
2017-08-01 00:00:00.000 -10763.73
2017-08-01 00:00:00.000 -10763.73
2017-08-01 00:00:00.000 10763.73
2017-08-01 00:00:00.000 10763.73
2017-08-01 00:00:00.000 3775585
2017-08-01 00:00:00.000 3786348.73
2017-08-02 00:00:00.000 -1550780
2017-08-02 00:00:00.000 -4823
2017-08-02 00:00:00.000 -4823
2017-09-11 00:00:00.000 -254800
2017-09-11 00:00:00.000 254800
sql-server t-sql finance irr
2个回答
0
投票

有什么理由不使用小数而不是浮点数吗?

请参阅 Bert Wagner 的 此链接

以下是其中的摘录:

浮点数学错误可以通过多种方式修复。

一种选择是停止关心他们。浮动时发生的错误 非常小(尽管通过算术复合时,误差 可以变得足够大而引人注目,就像我的报告条形图一样 例子)。如果您正在编写如此小的查询或报告 错误数量并不重要,那么你可以继续你的快乐 无需改变任何东西。

第二个选择是仍然将值存储为浮点数(对于那个甜蜜的, 节省存储空间),但请确保您的应用程序代码具有 正确舍入精确数字的业务逻辑。

但是,如果您的数据每次都需要完全准确 如果没有错误,请使用不同的数据类型。这里的逻辑选择 在 SQL Server 中使用十进制,它使用不同的内部 存储数字的方法,每次都会产生完美的结果 时间。然而,可能值的范围没有 float 那么大, 您将为该精度付出额外字节的存储费用 空间。

最后,浮点对于许多应用程序来说已经足够了。这 重要的是您知道这些类型的错误可能会 发生并且您妥善处理它们。


0
投票

您的问题可能与浮点数据类型与数字数据类型无关。根据 IRR 的定义和线性优化方法,有时 IRR 估计值 @X 可能是 <= -1 (or -100 %), and raising zero to a negative power causes an error (as it is equivalent to raising (1/0) to a positive power). Also, IRRs at or below -100 % make little sense, so you may want to control the result somehow anyway.

我编写了一个基于集合的解决方案,一个 IRR 的内联表值函数(在 TSQL 中),能够同时计算无限数量的 IRR。请参阅https://sqlperformancemeasurement.blogspot.com/2024/12/calculate-irr-dpi-rvpi-and-tvpi-part.html

© www.soinside.com 2019 - 2024. All rights reserved.