我正在使用SQL Server Management Studio,并且具有以下架构:
CREATE TABLE tmp(
id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
toleranceRegion DECIMAL
)
然后我执行以下插入:
INSERT INTO tmp VALUES(3.2);
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);
预期产出:
id toleranceRegion
-- ---------------
1 3.2
2 5.678
3 1.95
实际输出:
id toleranceRegion
-- ---------------
1 3
2 6
3 2
为什么插入的toleranceRegion值会舍入到最接近的整数?
答案 0 :(得分:13)
您没有为小数定义比例/精度。如果您想要小数点后的3位数,则应将其定义为DECIMAL(9,3),这将给出小数点前6位和小数最多3位。 您需要分析预期的数据,并根据您的预期指定列定义的正确精度和比例。
CREATE TABLE tmp(
id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
toleranceRegion DECIMAL(9,3)
)
请参阅decimal here的Sql Server文档。
答案 1 :(得分:4)
这是因为您没有设置 scale ,这意味着系统使用的默认比例为零:
s(比例) 将存储在小数点右侧的小数位数。从p中减去此数字以确定小数点左侧的最大位数。可以存储在小数点右侧的最大小数位数。比例必须是从0到p的值。只有在指定精度时才能指定比例。 默认比例为0 。 (重点补充)
换句话说,SQL Server将零位数存储在小数点右侧。
答案 2 :(得分:3)
设定精确度
十进制(18,4)
这将是小数
答案 3 :(得分:1)
这里的问题是你如何定义DECIMAL列的精度?
如果它是DECIMAL(10,2),它将总共有11个数字,其中2个是十进制值(2个十进制舍入意味着10.215保存为11.22,11.214保存为11.21)。
如果它是DECIMAL(10),它将没有任何小数值并被舍入为整数。
在你的问题中你定义了toleranceRegion DECIMAL
所以它被四舍五入到下一个整数如果你声明像
CREATE TABLE tmp(
id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
toleranceRegion DECIMAL(10,3)
)
然后它不会四舍五入,你会得到你想要的结果
INSERT INTO tmp VALUES(3.2);
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);
输出:
id toleranceRegion
-- ---------------
1 3.2
2 5.678
3 1.95
注意: - 如果您使用FLOAT或DOUBLE PRECISION,您不必指定小数值的数量,但它有自己的缺陷。
有关详细信息,您可以click here