-2

使用 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 ......,我在运行时遇到错误。

这该怎么做。

需要查询帮助

4

2 回答 2

2

有一个非常简单的解决方案。你可以在 BOL 中找到它。Round 接受一个可选的第三个参数,它是 round 类型。这些值是舍入或截断的。

ROUND numeric_expression , 长度 [ ,function ] )

...

function 是要执行的操作类型。函数必须是 tinyint、smallint 或 int。当 function 被省略或值为 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(无限期)。您需要将其中一个数字转换为浮点数,因为 sql 假设它们是整数,否则进行整数除法。您当然可以将它们都转换为浮点数,但只要一个是浮点数,另一个也会被转换。

于 2012-05-11T20:43:26.313 回答
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
于 2012-05-11T20:09:14.350 回答