关于货币:我应该使用Sharepoint Number列类型来存储货币值吗?

Should I use Sharepoint Number column types to store monetary values?

在SharePoint中,我可以创建"数字"类型的列表列。我需要存储货币量,并且希望能够使用此列类型,而不必创建新的列类型。

此类型的值是否由SharePoint存储和操作(例如,在列表视图中求和值时)以防止精度损失(即,不是某种近似的浮点类型)?

我看过货币栏,但它们似乎强制显示在我的应用程序中没有意义的货币单位(我怀疑它们是作为"数字"存储在引擎盖下)。


虽然不是决定性的,但根据以下测试,SharePoint似乎以适合货币计算的方式处理数字(至少使用WSS 3.0/SQL Server 2005),即使这些数字大约存储在一起。然而,超过15个有效数字的值可能显示舍入误差:

存钱和取钱测试

三列数字列(FirstSecondThird,分别包含3.7、3.65和0.05(此处为净示例),计算列(返回单行文本),公式如下:=IF(First=Second+Third,"Success","Failure")。在查看列表时,计算列显示成功。

资金计算测试

一个有公式=0.1+0.1+0.1=0.3的"是/否"计算列(这里是.net示例)。查看列表时,计算列显示"是"。

存钱计算测试一

在名为TestList的列表中,自定义数字列(CustomNumber包含304253.3251(Microsoft白皮书中的SQL Server示例)。存储在数据库表AllUserData中,列float1中,类型为float(SQL Server 2005)。float是一种近似的数据类型。

运行以下查询:

1
2
3
4
5
6
7
8
9
10
DECLARE @ListName UNIQUEIDENTIFIER
SET @ListName = (SELECT tp_Id FROM AllLists WHERE tp_Title = 'TestList')

SELECT CAST(float1 as NUMERIC(18, 11)) AS CustomNumber
FROM AllUserData
WHERE tp_ListId = @ListName

SELECT float1 AS CustomNumber
FROM AllUserData
WHERE tp_ListId = @ListName

给出以下结果:

1
2
3
4
5
CustomNumber
304253.32510000002

CustomNumber
304253.3251

用公式=CustomNumber*100000000000创建一个计算列,它可能会显示不正确的30425332510000002值,实际上(从用户的角度)显示了正确的30,425,332,510,000,000.00000值。我假设这种行为是由于代码从数据库中读取float值,并使用适当的小数位对numeric进行强制转换,并使用.NET十进制类型操作内存中的值。

但是,有人建议,在SQL Server 2000上,在这种情况下可能会出现计算错误,因为版本之间的float值的行为已经发生了更改。

存钱和取钱测试二

根据上一次测试的结果,将以下值添加到CustomNumber列中:999999999999999。

此16位有效数字值在列表(和编辑)视图中错误地显示为1000000000000000(使用15位数字的值正确显示)。

检查AllUserData表显示该值在数据库中存储错误,并运行以下查询:

1
2
3
DECLARE @f FLOAT
SET @f = 9999999999999999
SELECT CAST(@f as NUMERIC(20, 0))

给出结果:

1
10000000000000000

这说明SQL Server正在对插入的数字进行舍入。


数字就是这样使用的,是的。在求和值时,不应该有任何精度损失的问题。