SQL中除法计算保留整数或几位小数(除法那些事儿!)

一、前言

    在写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函数 的使用详解”。

      就先写到这,哈哈!一个小问题被我复杂化了,不喜勿喷。

原创文章 87 获赞 17 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Alone_in_/article/details/105972368