在SharePoint中,我可以创建“Number”类型的列表列。我需要存储货币金额,并希望能够使用此列类型而不必创建新列。
SharePoint是否存储和操作此类型的值(例如,在列表视图中对值进行求和时)以防止精度损失(即不是某种近似浮点类型)?
我查看了货币列,但它们似乎强制显示一个在我的应用程序中没有意义的货币单位(我怀疑它们在发动机罩下存储为'数字')。
答案 0 :(得分:7)
虽然不是决定性的,但基于以下测试,它看起来像SharePoint以适合货币计算的方式处理数字(至少使用WSS 3.0 / SQL Server 2005),即使它们大致存储。但是,超过15个有效数字的值可能会出现舍入错误:
测试存储和检索资金
三个数字列(First
,Second
和Third
)分别包含3.7,3.65和0.05(来自here的.Net示例)和一个计算列(返回一个单行文本),使用以下公式:=IF(First=Second+Third,"Success","Failure")
。在查看列表时,计算列会显示成功。
货币计算测试
带有公式=0.1+0.1+0.1=0.3
的是/否计算列(来自here的.Net示例)。在查看列表时,计算列显示是。
测试存钱和计算我
在名为TestList
的列表中,自定义数字列(CustomNumber
)包含304253.3251(来自Microsoft White Paper的SQL Server示例)。它存储在类型AllUserData
的数据库表float1
,列float
中(SQL Server 2005)。 float
是近似数据类型。
运行以下查询:
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
给出以下结果:
CustomNumber
304253.32510000002
CustomNumber
304253.3251
创建一个公式为=CustomNumber*100000000000
的计算列,可能会显示30425332510000002
实际的错误值,显示30,425,332,510,000,000.00000
的正确值(从用户的角度来看) 即可。我假设这种行为是由于代码读取数据库中的float
值,使用适当的小数位数进行转换为numeric
并使用.Net Decimal类型操作内存中的值
但是,suggestions在SQL Server 2000上计算错误可能会在这种情况下出现,因为版本之间的float
值的行为已经改变。
测试资金存储和检索II
根据上一个测试的结果,将以下值添加到CustomNumber
列:9999999999999999。
这个16位有效数字值在列表(和编辑)视图中显示为10,000,000,000,000,000 (使用正确显示15位数的值)。
检查AllUserData
表显示该值未正确存储在数据库中并运行以下查询:
DECLARE @f FLOAT
SET @f = 9999999999999999
SELECT CAST(@f as NUMERIC(20, 0))
给出结果:
10000000000000000
这表明SQL Server在插入时将数字四舍五入。
答案 1 :(得分:0)
号码打算以这种方式使用,是的。在对值进行求和时,您不应该遇到精度损失的问题。