这个问题比较简单。我需要计算 3 列,其中中间结果是巨大的小数,而且我很早就遇到了一个问题,SQL Server 基本上舍入小数,而不管任何转换/转换。
例如,让我们做一个简单的除法为 1234/1233。计算器将产生 1,00081103000811。但是当我在 SQL Server 上执行此操作时,我们得到以下信息:
-- Result: rounded at 1.000811000... with trailing zeroes up until the 37 precision
SELECT CAST(CAST(1234 AS DEC(38,34))/CAST(1233 AS DEC(38,34)) AS DEC(38,37))
-- Result: rounded at 1.000811
SELECT CONVERT(DECIMAL(38,32), 1234)/CONVERT(DECIMAL(38,32),1233)
-- Correct result at 1,00081103000811
-- But this requires the zeroes to be put in manually when you don't
-- even know the precision of the end result
SELECT 1234.0/1233.00000000000000
为什么会发生这种自动舍入?当您无法确定一个数字(int 或 dec 部分)有多大时,计算超长十进制值的最佳方法是什么,因为该表可以包含各种不同的值?
谢谢!
tl;博士
不要用 SQL 语言进行计算
更长
结果的比例和精度在 MSDN 上得到了很好的定义。这并不直观,真的。然而,简单来说,当输入比例很高时,精度会丢失,因为结果比例需要下降到 38 并匹配精度下降。
确认事情
这意味着结果比例和精度没有截断(见打击)
更多关于第一个和第三个案例..
除法的结果比例为
max(6, s1 + p2 + 1)
:你有一些选择
最后,请参阅 SO https://stackoverflow.com/questions/423925/t-sql-decimal-division-accuracy/424052#424052
不确定这是否有帮助,但对我来说,我的临时表列设置为十进制,我将 convert(decimal(15,2), 0.65) 从插入传递到 temp_table。这是自动舍入,我将列类型更改为小数(16,2)以匹配正在传递的内容。表现在存储 0.65。
我不得不做一个工作。这是我所做的:
结果:
希望这可以帮助。