SQL Server 舍入太早

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

这是我的问题的查询示例:

DROP TABLE IF EXISTS #ExampleData
CREATE TABLE #ExampleData ( [ProratePercent] decimal(38,19) NOT NULL)

INSERT INTO #ExampleData ([ProratePercent])
VALUES
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652174 ),( 0.0434782608695652174 ),( 0.0434782608695652174 ),
( 0.0434782608695652173 ),( 0.0434782608695652173 )
  
SELECT  CAST(225 AS decimal(38,19)) * ProratePercent, ProratePercent
FROM    #ExampleData

这会创建一些我在实际代码中计算的百分比。

注意最后两个以 3 结尾,其余以 4 结尾

然后将它们乘以总值 (225) 以获得按比例分配的值。

进行乘法运算时,每行的结果值为

9.782608695652174
。 该值四舍五入为 15 位数字。

然后我直接运行数学。

SELECT  225 * 0.0434782608695652173
SELECT  225 * 0.0434782608695652174

这让我获得了我希望获得的价值观:

9.7826086956521738925

9.7826086956521739150

我怎样才能得到实际的SQL来给我完整的数字?

我已经尝试过:

SELECT  CAST(225 AS decimal(38,19)) * ProratePercent, ProratePercent
FROM    #ExampleData

令人惊讶的是,这导致了更多精度的损失。 为每一行指定

9.782609
值。 (6位精度)

sql sql-server
1个回答
0
投票

我找到了这个答案:https://dba.stackexchange.com/questions/77664/how-does-sql-server-define- precision-scale

它表明,如果将每个操作数和最终结果转换为您想要的类型,则不会进行舍入。

对于我的例子,这是一种方法:

SELECT  CONVERT(decimal(38,30), CONVERT(decimal(38,30),225) * 
            CONVERT(decimal(38,30), ProratePercent))
FROM    #ExampleData
© www.soinside.com 2019 - 2024. All rights reserved.