使用 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 ......,我在运行时遇到错误。
这该怎么做。
需要查询帮助
使用 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 ......,我在运行时遇到错误。
这该怎么做。
需要查询帮助
有一个非常简单的解决方案。你可以在 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 假设它们是整数,否则进行整数除法。您当然可以将它们都转换为浮点数,但只要一个是浮点数,另一个也会被转换。
不是非常优雅,但适用于所有情况:
总计选择 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