为啥我的十进制值在 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 插入中被四舍五入为整数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]
oracle我建表时的数据类型是int,为啥插值的时候小数照样能插不报错?
SQL Server 2008:为啥不四舍五入到小数点后两位?