SQL计算输出精度
SQL calculation output precision
有人可以解释这个查询的行为吗:
SELECT
0.1 + 0.01,
'',
(CAST(0.1 AS numeric(18,1)))+(CAST(0.01 AS numeric (18,2))),
0.1 + (CAST(0.01 AS numeric (18,2))),
(CAST(0.1 AS numeric(18,1)))+ 0.01,
'',
(CAST(0.1 AS numeric(38,1)))+(CAST(0.01 AS numeric (38,2))),
0.1 + (CAST(0.01 AS numeric (38,2))),
(CAST(0.1 AS numeric(38,1)))+ 0.01
我不明白为什么 38 的行为与 18 不同?
我原以为 SQL 服务器总是会自动 return 以准确显示结果所需的精度计算结果?要改变它,您必须显式转换结果吗?
它遵循此处找到的规则:Precision, Scale, and Length (Transact-SQL) - msdn
当您使用最大精度时,无法在不损失精度的情况下调整比例。
Chart for Data Type Conversion (Database Engine) - msdn
如果您在计算中引入 float
,您将得到 float
return。
默认情况下,带小数的值将隐式转换为 decimal/numeric 数据类型。在根据您的问题修改的示例中,这些隐式转换被标记为 'und'
:
select
undefined=0.1 + 0.01
,[18,1+18,2] = (cast(0.1 as numeric(18,1)))+(cast(0.01 as numeric (18,2)))
,[und+18,2+18,1] = 0.1 + (cast(0.01 as numeric (18,2)))
,[18,2+und]=(cast(0.1 as numeric(18,1)))+ 0.01
,[38,1+38,2]=(cast(0.1 as numeric(38,1)))+(cast(0.01 as numeric (38,2)))
,[und+38,2] = 0.1 + (cast(0.01 as numeric (38,2)))
,[38,1+und]=(cast(0.1 as numeric(38,1)))+ 0.01
,[38,1+float]=(cast(0.1 as numeric(38,1)))+ convert(float,0.01)
rextester 演示:http://rextester.com/ULVRGS77309
returns:
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+
| undefined | 18,1+18,2 | und+18,2+18,1 | 18,2+und | 38,1+38,2 | und+38,2 | 38,1+und | 38,1+float |
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+
| 0,11 | 0,11 | 0,11 | 0,11 | 0,1 | 0,11 | 0,1 | 0,11 |
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+
有人可以解释这个查询的行为吗:
SELECT
0.1 + 0.01,
'',
(CAST(0.1 AS numeric(18,1)))+(CAST(0.01 AS numeric (18,2))),
0.1 + (CAST(0.01 AS numeric (18,2))),
(CAST(0.1 AS numeric(18,1)))+ 0.01,
'',
(CAST(0.1 AS numeric(38,1)))+(CAST(0.01 AS numeric (38,2))),
0.1 + (CAST(0.01 AS numeric (38,2))),
(CAST(0.1 AS numeric(38,1)))+ 0.01
我不明白为什么 38 的行为与 18 不同?
我原以为 SQL 服务器总是会自动 return 以准确显示结果所需的精度计算结果?要改变它,您必须显式转换结果吗?
它遵循此处找到的规则:Precision, Scale, and Length (Transact-SQL) - msdn
当您使用最大精度时,无法在不损失精度的情况下调整比例。
Chart for Data Type Conversion (Database Engine) - msdn
如果您在计算中引入 float
,您将得到 float
return。
默认情况下,带小数的值将隐式转换为 decimal/numeric 数据类型。在根据您的问题修改的示例中,这些隐式转换被标记为 'und'
:
select
undefined=0.1 + 0.01
,[18,1+18,2] = (cast(0.1 as numeric(18,1)))+(cast(0.01 as numeric (18,2)))
,[und+18,2+18,1] = 0.1 + (cast(0.01 as numeric (18,2)))
,[18,2+und]=(cast(0.1 as numeric(18,1)))+ 0.01
,[38,1+38,2]=(cast(0.1 as numeric(38,1)))+(cast(0.01 as numeric (38,2)))
,[und+38,2] = 0.1 + (cast(0.01 as numeric (38,2)))
,[38,1+und]=(cast(0.1 as numeric(38,1)))+ 0.01
,[38,1+float]=(cast(0.1 as numeric(38,1)))+ convert(float,0.01)
rextester 演示:http://rextester.com/ULVRGS77309
returns:
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+
| undefined | 18,1+18,2 | und+18,2+18,1 | 18,2+und | 38,1+38,2 | und+38,2 | 38,1+und | 38,1+float |
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+
| 0,11 | 0,11 | 0,11 | 0,11 | 0,1 | 0,11 | 0,1 | 0,11 |
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+