为什么我的十进制值在SQL插入中舍入为整数?

时间:2016-06-27 20:30:14

标签: sql sql-server ssms rounding

我正在使用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值会舍入到最接近的整数?

4 个答案:

答案 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