Server SQL查询四舍五入 解决方法 以及不出现无限循环小数
写给老师的诗-廉洁自律演讲稿
1.SQL查询四舍五入解决方法
方法1:
SELECT
CAST('123.456' as decimal) 将会得到 123(小数点后面的将会被省略掉)。
如果希望得到小数点后面的两位。
则需要把上面的改为
SELECT
CAST('123.456' as decimal(38, 2)) ===>123.46
说明1:
这里的decimal英文为: 小数, 十进制
decimal(38,2)
这里的38是这个小数的位数有多少位,
一般最大不超过38位, 所以写38是不会出错的!
如果:
SELECT
CAST('123.456' as decimal(2, 2))
就会出错, 为什么呢,
因为这个123.456小数点后是3位值, 所以这个38这个位置最少是3!
说明2:
decimal后面的参数中的2是小数点后取几位, 是2就取两位, 是3就取三位!
并且是四舍五
入后的结果!
说明3:
cast应该就是转换数值的意思了
自动四舍五入了!
方法2:
SELECT
ROUND(123.75633, 2, 1), ROUND(123.75633, 2)
上面
的SQL得到的2个值是不一样的,前一个是:123.75000,后一个是:123.76000。
因为前者在进行四舍五入之前,小数点后已经被截取,保留了2位。
而后者则没有被截取,四舍五入时自然就会得到123.76000
ROUND
返回数字表达式并四舍五入为指定的长度或精度。
语法
ROUND ( numeric_e-xpression , length [ ,
function ] )
参数
numeric_e-xpression
精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。
length
是 numeric_e-xpression
将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当
length 为正数时,numeric_e-xpression 四舍五入为 length
所指定的小数位数。当 length 为
负数时,numeric_e-xpression 则按
length 所指定的在小数点的左边四舍五入。
function
是要执行的操作类型。function 必须是 tinyint、smallint 或
int。如果省略 function 或
function 的值为
0(默认),numeric_e-xpression 将四舍五入。当指定 0
以外的值时,将
截断 numeric_e-xpression。
返回类型
返回与 numeric_e-xpression 相同的类型。
注释
ROUND 始终返回一个值。如果 length 是负数且大于小数点前的数字个数,ROUND
将返
回 0。
示例结果
ROUND(748.58, -4) 0
当 length 是负数时,无论什么数据类型,ROUND 都将返回一个四舍五入的
numeric_e-xpression。
示例结果
ROUND(748.58, -1) 750.00
ROUND(748.58, -2)
700.00
ROUND(748.58, -3) 1000.00
示例
A. 使用 ROUND 和估计值
下例显示两个表达式,说明使用 ROUND
函数且最后一个数字始终是估计值。
Select ROUND(123.9994, 3),
ROUND(123.9995, 3)
GO
下面是结果集:
----------- -----------
123.9990
124.0000
B. 使用 ROUND 和四舍五入的近似值
下例显示四舍五入和近似值。
语句结果
Select
ROUND(123.4545, 2)
123.4500
Select
ROUND(123.45, -2)
100.00
C. 使用 ROUND
截断
下例使用两个 Select
语句说明四舍五入和截断之间的区别。第一个语句四舍五入结果。第
二个语句截断结果。
语句结果
Select ROUND(150.75, 0)
151.00
Select ROUND(150.75, 0, 1)
150.00
2.四舍五入后不出现无限循环小数
在此次报表中,发现报表计算的结果同客户原始
报表的数据存在些差异,因对方对数据的精
度要求较严格,所以不赶马虎,经多次对比,发现原始报表计
算使用4位精度,而现报价计
算采用float数据类型。15位精度,在结果上产生了部分差异,后经
商量,决定同客户原始
系统一致,采用4位精度计算,在SQL Server中,对float数据类
型的四舍五入可以采用round
()函数,由于结果是采用计算表达式,结果中产生了无限循环小数,
直接使用round()
函数并不能进行四舍五入操作,需先进行数据类型的转换,将float类型的
结果先行转换为
numeric数据类型,再进行round()四舍五入操作,才能得到正确结果。看
来在SQL Server
中采用float数据类型时得再多层考虑
select gld
,round(convert(numeric(6,3),ejgyjfbz),2),round(con
vert(numeric(6,3),sjgyjfbz),2) from
gld