为啥我的十进制值在 SQL 插入中被四舍五入为整数?

Posted

技术标签:

【中文标题】为啥我的十进制值在 SQL 插入中被四舍五入为整数?【英文标题】:Why are my decimal values being rounded to integers in SQL insertions?为什么我的十进制值在 SQL 插入中被四舍五入为整数? 【发布时间】:2016-06-27 20:30:14 【问题描述】:

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

【问题讨论】:

为什么不设置精度和比例? 您没有为小数定义比例/精度。如果您想要小数点后 3 位数字,则应将其定义为 DECIMAL(9,3),这将给您小数点前 6 位和最多 3 位的小数。 [举手]好吧,我承认我爱上了这个。尽管答案确实完全有意义,但我确实发现默认比例(0)实际上并没有首先创建(我的想法)小数点有点陷阱。什么是默认设置确保你掉进成功的坑而不是失败的坑? 【参考方案1】:

您没有为小数定义小数位数/精度。如果您想要小数点后 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 文档。

【讨论】:

【参考方案2】:

这是因为你没有设置刻度,也就是说系统使用的是默认的0刻度:

s(比例) 将存储在小数点右侧的小数位数。从 p 中减去该数字以确定小数点左侧的最大位数。小数点右侧可以存储的最大小数位数。比例必须是从 0 到 p 的值。仅当指定精度时才能指定比例。 默认比例为 0。 (强调)

换句话说,SQL Server stores zero digits to the right of decimal point。

【讨论】:

【参考方案3】:

设置你的精度

十进制(18,4)

这是小数

【讨论】:

【参考方案4】:

这里的问题是您如何定义 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

【讨论】:

以上是关于为啥我的十进制值在 SQL 插入中被四舍五入为整数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的字符串值在插入 SQL 数据库时会累积空格?

为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]

oracle我建表时的数据类型是int,为啥插值的时候小数照样能插不报错?

SQL Server 2008:为啥不四舍五入到小数点后两位?

Microsoft SQL 四舍五入为整数,需要保留 1 位小数 [重复]

SQL中decimal和numeric为啥会自动四舍五入啊?我是想保留有小数的怎么办?