繁体   English   中英

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

[英]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 值四舍五入到最接近的整数?

您没有为小数定义比例/精度。 如果您想要小数点后的 3 位数字,您应该将其定义为 DECIMAL(9,3),这将为您提供小数点前 6 位和最多 3 位小数。 您需要分析预期数据并根据预期为列定义指定正确的精度和小数位数。

CREATE TABLE tmp(
    id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
    toleranceRegion DECIMAL(9,3)
)

请参阅此处的 Sql Server 文档了解十进制

这是因为您没有设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM