sql server 小数字段设为哪种类型?

是的,这就是问题所在。
在 SQL Server 中使用 float 和decimal 作为小数位。
浮点近似,精度较差。
精确的,精确的十进制值。
在计算小数除法时,SQL Server会自动转换类型以保持精度。
使用十进制数是正确的。
你自己看看吧。

SqlServer中decimal,float 和 real 数据类型的区别

说实话,当我第一次接触SQL Server的decimal和numeric类型时,这些数据类型感觉相当冗长。
想一想;您必须监视 p 和 s 这两个参数并记住 3 8 个数字的上限。
我之前在一个 ERP 项目中遇到了一个错误——有一个财务报告要求,它必须保留小数点后四位。
结果,我把十进制(1 8 ,4 )写成了十进制(1 8 ,2 ),所有的报告都完全混乱了。
教训是,当您为变量赋值时,必须口头验证精度和小数位数。

有趣的是,浮点数与人类的计数习惯完全不同。
为了专门研究这一点,IEEE7 5 4 标准定义了四种算术运算作为二进制数学运算。
我有一位同事了解到结果必须始终四舍五入。
例如,如果将 0.1 存储在浮点数中;实际存储的可能是无限位小数,数据库中显示的值可能是0.1 0000000000000001 我在测试银行系统时遇到了这样的错误 - 当我比较两个看似相同的浮点数时,结果相差数亿点。

回到转换问题;给我印象最深的是decimal和numeric类型。
SQL Server 带有十进制 (5 ,5 )。
decimal(5 ,0) 被视为两种不同的类型。
当我编写存储过程时,尝试重用变量,但发现将十进制(5 ,5 )转换为十进制(5 ,0)会导致错误。
当时我还在想这两个在数据库内存中是否真的被认为是不同的数据结构。
查了文档才知道,这是为了精确控制,避免隐式转换。
所以现在写SQL的时候,用于声明因运维原因不能在半夜运行的变量时定义精度。

浮点数溢出也很有趣。
当处理大量数据时,将int类型数据直接转换为decimal会导致溢出和损坏。
SQL Server当时请求“数值溢出”,花了一天半的时间才意识到某个临时表的数据容量已经超出。
后来我要么改成数字类型,要么先改成varchar处理然后就搞定了。
但最烦人的是默认翻译。
例如,如果使用float类型数据来精确比较WHERE条件。
SQL Server会自动将其转换为数字,结果为可能略有不同。
因此,在编写 WHERE 子句时,请始终注意浮点类型。

然而,小数和数字是有问题的,但是当用在正确的地方时它们可以真正有效。
我最近在运输系统中使用十进制(1 8 ,2 )来运输货物。
小数点后两位不会出错。
结果,系统变得更加稳定。
相反,以前的系统,商店价格采用浮动价格,这意味着每次计算折扣时财务部门都会打电话投诉。
因此,根据需要对货币进行计算和计量的情况,小数是一个严肃的事情。

decimal的用法有哪些?

准确的说,decimal(1 8 ,0)声明了一个最多1 8 位的精确小数类型,整数部分1 8 位,小数点0位。
由于许多人忽略了小数位数必须小于或等于整数位数这一硬性规则,这一事实使情况变得复杂。

我们先来说说最重要的事情。
去年我们运行了一个金融系统项目并使用decimal(1 8 ,0)来保存汇率。
结果,因为我们忘记了小数点后0位的限制,所以我们错误地导入了所有数据。
另一件事是,decimal 和 numeric 在 MySQL 中基本上是孪生兄弟,但decimal 有一个更容易记住的 dec 的 SQL-9 2 同义词。
还有一个非常重要的细节。
当交易量达到大约3 000笔交易/秒时,使用decimal实际上快了一倍多,但编写代码却慢了一倍。
这就是为什么一开始我认为十进制是灵丹妙药,但后来我意识到有些问题。

等等,还有一件事。
在PowerBuilder中直接使用十进制确实很容易,但是在VS中,你必须添加M后缀。
提醒一下,不要在性能要求高的循环中使用小数,否则你的老板看到CPU峰值会骂你。