SQL中详解round(),floor(),ceiling()函数的⽤法和区
别?
应⽤中使⽤四舍五⼊的值,我和我的⽤户在报表应⽤中的计算问题存在分歧。所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切。请问您有没有这⽅⾯的⾼见?我想看到⼀些带有不同编码选项的例⼦。
Examda提⽰:如果不理解基本的数据类型和四舍五⼊函数,那么你就可能误解四舍五⼊。由于数据类型的差异(⽐如integer,float,decimal等等),四舍五⼊后的值可能会不同。另外,由于在计算中使⽤的SQL Server舍⼊函数(ROUND(),CEILING(),FLOOR())的差异,得到的结果值也可能会不同。因此,到⽤户对四舍五⼊的要求接着把这些要求转化到适当的T-SQL命令中是很重要的。
让我们先从定义的⾓度开始:
ROUND() – 四舍五⼊⼀个正数或者负数,结果为⼀定长度的值。
CEILING() - 返回最⼩的整数,使这个整数⼤于或等于指定数的数值运算。
FLOOR() - 返回最⼤整数,使这个整数⼩于或等于指定数的数值运算。
让我们来看看有不同数据类型的函数的结果。
ROUND(),CEILING()和FLOOR()例⼦
例⼦
值
在这个例⼦中,你可以看到,在⼀个正整数的情况下,这三个舍⼊函数返回相同的值。
DECLARE @value int
SET @value = 6
SELECT ROUND(@value, 1) 6
SELECT CEILING(@value) 6
SELECT FLOOR(@value) 6
在第⼆个例⼦中,即使在⼀个负整数的情况下,这三个舍⼊函数还是返回相同的值。
DECLARE @value int
SET @value = -11
SELECT ROUND(@value, 1) -11
SELECT CEILING(@value) -11
SELECT FLOOR(@value) -11
要证明整数这个观点,四舍五⼊是不可能的。让我们来看看⼀些其他的数据类型。
DECLARE @value int
SET @value = -11.5
SELECT ROUND(@value, 2) -11
SELECT CEILING(@value) -11
SELECT FLOOR(@value) -11
在我们的例⼦中,⽤⼀个⼩数数据类型和不同长度参数(⽐如1,2或者3)的舍⼊函数会产⽣不同的终值。当四舍五⼊这个值并且长度参数是1时,⼩数点后第⼆位的5是有意义的。另外,在⼩数数据类型中,CEILING和 FLOOR函数也会考虑⼩数位,因为会得到不同的值。
DECLARE @value decimal(10,2)
SET @value = 11.05
SELECT CEILING(@value) 12
SELECT FLOOR(@value) 11
如同上⾯的例⼦,基于不同的长度参数,⼩数点后第⼆位的6是有意义的。
DECLARE @value decimal(10,2)
SET @value = -14.46
SELECT ROUND(@value, 1) -14.50
SELECT ROUND(@value, 2) -14.46
SELECT ROUND(@value, 3) -14.46
SELECT CEILING(@value) -14
SELECT FLOOR(@value) -15
这个例⼦也有助于描述四舍五⼊值的破坏。这个例⼦也证明了CEILING和 FLOOR 函数四舍五⼊成最近的函数。
DECLARE @value decimal(10,10)
SET @value = .5432167890
SELECT ROUND(@value, 1) 0.5000000000
SELECT ROUND(@value, 2) 0.5400000000
SELECT ROUND(@value, 3) 0.5430000000
SELECT ROUND(@value, 4) 0.5432000000
SELECT ROUND(@value, 5) 0.5432200000
SELECT ROUND(@value, 6) 0.5432170000
SELECT ROUND(@value, 7) 0.5432168000
SELECT ROUND(@value, 8) 0.5432167900
SELECT ROUND(@value, 9) 0.5432167890
SELECT ROUND(@value, 10) 0.5432167890
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0
在最后的例⼦中,你可以看到在浮点数据类型⾥采取与上⾯⼩数点的例⼦相同类型的⾏为。另外,CEILING和FLOOR函数四舍五⼊成最近的函数。
DECLARE @value float(10)
int函数与round函数SET @value = .1234567890
SELECT ROUND(@value, 4) 0.1235
SELECT ROUND(@value, 5) 0.12346
SELECT ROUND(@value, 6) 0.123457
SELECT ROUND(@value, 7) 0.1234568
SELECT ROUND(@value, 8) 0.12345679
SELECT ROUND(@value, 9) 0.123456791
SELECT ROUND(@value, 10) 0.123456791
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0
round() 遵循四舍五⼊把原值转化为指定⼩数位数,如:round(1.45,0) = 1;round(1.55,0)=2 floor()向下舍⼊为指定⼩数位数 如:floor(1.45,0)= 1;floor(1.55,0) = 1
ceiling()向上舍⼊为指定⼩数位数 如:ceiling(1.45,0) = 2;ceiling(1.55,0)=2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论