如何减少浮动长度

时间:2012-04-16 08:03:39

标签: sql sql-server

使用SQL Server 2000

我想减少小数长度

查询

Select 23/12 as total

输出显示为1.99999999999

我不想对值进行舍入,我想像这样1.99

进行显示

尝试查询

Select LEFT(23/12, LEN(23/12) - 3) as total

上述查询仅在存在十进制值(如12.444444)时有效,但如果总数为单位数意味着像12或4或11 ....,我在运行时收到错误。

如何做到这一点。

需要查询帮助

2 个答案:

答案 0 :(得分:2)

有一个非常简单的解决方案。你可以在BOL找到它。 Round采用可选的第3个参数,即圆形类型。值是圆形或截断的。

  

ROUND numeric_expression,length [,function])

     

...

     

function是要执行的操作类型。功能必须   tinyint,smallint或int。省略函数或者值为。时   0(默认值),numeric_expression是四舍五入的。当值不是0时   指定后,numeric_expression被截断。

所以就这样做

Select ROUND(cast(23 as float)/12, 2, 1) as total

得到1.91。请注意,如果您真的看到1.999 - 您的计算机出了问题。 23/12 = 1.916666666(ad infinitum)。你需要将其中一个数字转换为float,因为sql假定它们是整数,否则进行整数除法。你当然可以将它们都作为浮点数投射,但只要一个浮动,另一个也将被转换。

答案 1 :(得分:1)

不是非常优雅,但适用于所有情况:

选择CONVERT(float,LEFT(CONVERT(nvarchar,23.0 / 12.0),CHARINDEX('。',CONVERT(nvarchar,23.0 / 12.0))+ 2))总计

标量函数

-- Description: Truncate instead of rounding a float
-- SELECT dbo.TruncateNumber(23.0/12.0,2)
-- =============================================
CREATE FUNCTION TruncateNumber
(
    -- Add the parameters for the function here
    @inFloat float,
    @numDecimals smallint
)
RETURNS float
AS
BEGIN
    IF (@numDecimals < 0)
    BEGIN
        SET @numDecimals = 0
    END
    -- Declare the return variable here
    RETURN CONVERT(float,LEFT(CONVERT(nvarchar, @inFloat),CHARINDEX('.',CONVERT(nvarchar, @inFloat)) + @numDecimals)) 

END
GO