sql 查询尾差(去尾0后小数点的位数)
最近有需要查询出现在数据库中有尾差的小数,就比如小数位保留2位,正常应该是666.120000,但是计算时有时会出现这样的情况:666.129999或是666.120060,正常应该是需要四舍五入的。
现在要查询出现尾差的小数,写了如下函数,在此记录下:
使用的是SQL Server数据库
--@inValue:小数值
--@length:保留的小数位数
ALTER FUNCTION [dbo].[CheckTailDiff](@inValue DECIMAL(23,10), @length INT)
RETURNS INT
AS
BEGIN
DECLARE @retValue INT
DECLARE @SrcValue VARCHAR(50)
DECLARE @MidValue VARCHAR(20)
--转换小数为字符串
SET @SrcValue=CAST(@inValue AS VARCHAR(20))
IF SUBSTRING(REVERSE(@SrcValue),PATINDEX('%[^0]%',REVERSE(@SrcValue)),1)='.'--小数部分全部为0时
set @MidValue =''
ELSE
set @MidValue =LEFT(@SrcValue,LEN(@SrcValue)- PATINDEX('%[^0]%.%',REVERSE(@SrcValue))+1)
SET @retValue=0;
IF @MidValue<>''
BEGIN
SET @retValue=LEN(@MidValue) - CHARINDEX('.', @MidValue)
END
RETURN @retValue
END
使用如下:
SELECT dbo.CheckTailDiff(77441.1200000060,2)
假如应该是两位小数,如果是77441.1200000000,返回值是2(去尾0的小数位数),表明数据是正常的,没有尾差;
如果是77441.1200000060,返回值是9(去尾0的小数位数),表明数据有尾差;
把这个函数嵌入到查询语句中就可以查询有尾差的值了。