[英]Why are my decimal values being rounded to integers in SQL insertions?
我正在使用 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 值四舍五入到最接近的整数?
这是因为您没有设置scale ,这意味着系统使用默认比例为零:
s(小数位数)将存储在小数点右侧的小数位数。 从 p 中减去该数字以确定小数点左侧的最大位数。 小数点右侧可以存储的最大小数位数。 比例必须是从 0 到 p 的值。 只有在指定精度时才能指定比例。 默认比例为 0 。 (强调)
换句话说, SQL Server 在小数点右侧存储零位。
设置精度
十进制(18,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,您不必指定十进制值的数量,但它有其自身的缺陷。
欲了解更多详情,您可以点击这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.