t-sql - TSQL除法时小数精度问题

标签 t-sql math sql-server-2012

我在 TSQL 中除法时遇到问题。我已阅读Precision, scale, and length (Transact-SQL)页,但我仍然无法弄清楚为什么会出现以下问题:

PRINT 1.4259276982890801000000/0.4259276982890801000000
-- Result 3.347816317222208

DECLARE @VAR1 DECIMAL(30,22) = 1.4259276982890801000000
DECLARE @VAR2 DECIMAL(30,22) = 0.4259276982890801000000
PRINT @VAR1/@VAR2
-- Result 3.34781631

问题

  • 那么为什么在这些情况下我会看到不同的精度,而数字却完全相同?
  • 我该如何修复它?

最佳答案

第一个 PRINT 语句中文字的实际精度和小数位数为 decimal(23,22)decimal(22,22)。每the documentation ,结果类型为decimal(38,15)。您可以使用 sp_describe_first_result_set 观察这一点:

EXEC sp_describe_first_result_set N'SELECT 1.4259276982890801000000;';
EXEC sp_describe_first_result_set N'SELECT 0.4259276982890801000000;';
EXEC sp_describe_first_result_set N'SELECT 1.4259276982890801000000/0.4259276982890801000000;';

变量均为decimal(30,22),因此结果为decimal(38,8):

EXEC sp_describe_first_result_set N'
DECLARE @VAR1 DECIMAL(30,22) = 1.4259276982890801000000;
DECLARE @VAR2 DECIMAL(30,22) = 0.4259276982890801000000;
SELECT @VAR1/@VAR2;';

您可以通过指定不同的变量精度和小数位数来修复它:

DECLARE @VAR1 DECIMAL(23,22) = 1.4259276982890801000000;
DECLARE @VAR2 DECIMAL(22,22) = 0.4259276982890801000000;
SELECT @VAR1/@VAR2;

关于t-sql - TSQL除法时小数精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60095972/

相关文章:

sql - 顺序不同

iphone - 从左到右在 objective c 中求解简单的数学表达式

sql-server - T-SQL FETCH_STATUS 替代方案

sql - 表中列的位置

math - 逆不完全 Gamma 函数的简单近似

javascript - 测量两个形状之间的距离

sql-server-2012 - 如果我要连接到不在域中的远程计算机,我可以在连接字符串中使用集成安全选项吗?

sql - 已删除数据库 SQL Server 2012 中的对象

sql - 无效的列名称 SQL Server 2012

SQL更新触发器无法处理多个条目