这是我的问题的查询示例:
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位精度)
我找到了这个答案: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