一、前言
在写Sql 的时候遇到个问题,两个整数 int 类型相除,我希望保留两位小数。
二、问题解决
1、知识普及:
select 10/3
-->3
select 10%3
-->1
select 11/4
-->2
select 11%4
-->3
/ 符号是取整,% 符号是取余。在上面的例子中,清晰的展示了它们的作用。需要注意的是 / 取整符号是直接截断的,11除于4结果应该是2.75,取整后就是2,由此可看出它是不会四舍五入的。
2、步入正题:
方法有三种:cast、convert 和 round。这里用10除于3举例。
(1)CAST函数
比较常用的就是CAST函数了,这里就是先将 int类型的 10 转换成了 float ,再去除于3,得出的结果就有无限小数,第一种写法比较特别,刚开始我也没看懂,怎么会多了一个点?!直到看到第二种写法才恍然大悟,只是它将小数位省略不写而已。结果是一样的。
select CAST(10*1./3 as decimal(8,2))
-->3.33
select CAST(10*1.0/3 as decimal(8,2))
-->3.33
(2)CONVERT函数
这种功能上和cast 类似,就是写法不同而已。
select CONVERT(decimal(8,2),10*1./3)
-->3.33
select CONVERT(decimal(8,2),10*1.0/3)
-->3.33
(3)ROUND函数
最后就是ROUND函数了,保留是保留了,但保留的是两位有效的小数,后面的很多个零就是根据默认类型自动填充的。
select ROUND(10*1./3,2)
-->3.330000
select ROUND(10*1.0/3,2)
-->3.330000
要去掉的话也方便,再丢回到前两个函数中转换一下即可,如:
select CONVERT(decimal(10,2),ROUND(10*1.00/3,2))
-->3.33
这方法看似多此一举,但也有他的用处。CAST函数和CONVERT函数都是自动四舍五入的,而ROUND函数有一个参数,设置非0的数后,就会变成直接截断。这里拿11除于4来举例会比较清晰,如下:
select ROUND(11*1.0/4,1)
-->2.800000
select ROUND(11*1.0/4,1,6)
-->2.700000
如果这个地方不是很理解,可以先参考我之前的一篇博客 “SQLServer中 ROUND函数、CAST 和 CONVERT函数 的使用详解”。
就先写到这,哈哈!一个小问题被我复杂化了,不喜勿喷。