【发布时间】:2015-08-12 11:42:43
【问题描述】:
在我的场景中,我试图了解在数据库(Sql Server)表中具有 real 数据类型的列的影响。我的数据库中有一个具有 real 数据类型的列。 数据是静态的,它始终是 0.0、0.1、0.2.. 到 1.0 范围内的值之一。
用例: 我必须总结列中的值并在一些包括财务数据的算术计算中使用总和值。
担心? 当我对列中的值求和时,它会给我更多小数位的结果。
测试:
我想对列值求和,并将其用于乘除计算。
我想对具有十进制和浮点数据类型的列中的同一组值重复 #1。
过程:我创建了三个不同的表,其中包含一个列和一组相同的值,但数据类型不同,一个是小数、浮点数和实数。并对它们中的每一个进行算术计算。
CREATE TABLE #tReal(d real);
INSERT INTO #tReal
SELECT 0.1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1;
select SUM(d) from #tReal
预期结果:5.9
实际结果: 5.8999999538064
而且,如果我对总和执行四舍五入运算,结果符合预期
declare @sumofd real
select @sumofd = SUM(d) from #tReal
select round(@sumofd , 1)
结果:5.9
另外,如果我将数据类型从 real 更新为 float
CREATE TABLE #tfloat(d float);
INSERT INTO #tfloat
SELECT 0.1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1;
select SUM(d) from #tfloat
预期结果:5.9
实际结果: 5.9
而且,如果我将数据类型从 real 更新为 decimal
,情况也是如此CREATE TABLE #tDecimal(d DECIMAL(3,2));
INSERT INTO #tDecimal
SELECT 0.1 UNION ALL
SELECT 1 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1 UNION ALL
SELECT 0.9 UNION ALL
SELECT 1;
select SUM(d) from #tDecimal
预期结果:5.94
实际结果: 5.94
而且,如果我对总和执行一些基本的算术运算,而不进行四舍五入,比如
declare @sumofdReal real
declare @sumofdFloat float
declare @sumofdDecimal decimal(3,2)
select @sumofdReal = SUM(d) from #tReal
select @sumofdFloat = SUM(d) from #tfloat
select @sumofdDecimal = SUM(d) from #tDecimal
乘法:
select @sumofdReal * 2
Result: 11.8
select @sumofdFloat * 2
Result: 11.8
select @sumofdDecimal * 2
Result: 11.88
部门:
select @sumofdReal / 2
Result: 2.95
select @sumofdFloat / 2
Result: 2.95
select @sumofdDecimal / 2
Result: 2.97000
删除表:
drop table #tReal
drop table #tfloat
drop table #tDecimal
以下是我的问题
- 在我的场景中,将数据类型设为真实会产生任何影响吗?
- 如果#1 是肯定的,会有什么样的影响?我是否必须将数据类型更改为浮点数或小数?为什么?
- 如果 #1 为否,为什么?请解释一下?
float 和 real 类型是否可以产生精确的结果,除此之外的任何舍入错误都会出现?
【问题讨论】:
-
小数部分的示例中是否有错误 - 为什么您的预期结果是 5.9?您的最后一个值为 0.944。
-
为什么你期望从小数计算中得到 5.9,一个小数(3,2)的精度是小数点后 2 位。
-
@Paddy 这是一个错字。更新为适当的值。
-
您的十进制示例完全错误:sqlfiddle.com/#!3/579e3.
-
@Mady,由于您的编辑,您的总和不再累加。
标签: sql sql-server