You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中如何识别money列的小数位数?

在SQL Server中识别MONEY类型列的有效小数位数

SQL Server的MONEY类型是固定精度的数值类型,默认存储4位小数。当你插入150.13时,系统会自动补全为150.1300存储,直接通过字符串转换计算小数位数时,会得到固定的4位,这就是你之前两次尝试失败的原因。

要区分示例中两条记录的有效小数位数(2位和4位),需要计算去掉末尾无效0后的实际小数位数,下面提供两种可行的解决方法:

方法一:字符串处理法

通过转换字符串并清理末尾的0,再计算小数部分长度:

SELECT 
    Amount,
    CASE
        -- 整数情况,小数位数为0
        WHEN Amount = FLOOR(Amount) THEN 0
        ELSE 
            -- 先替换0为空格,去掉末尾空格后换回0,得到去掉末尾无效0的字符串
            LEN(REPLACE(RTRIM(REPLACE(CONVERT(VARCHAR(20), Amount), '0', ' ')), ' ', '0')) 
            - CHARINDEX('.', REPLACE(RTRIM(REPLACE(CONVERT(VARCHAR(20), Amount), '0', ' ')), ' ', '0'))
    END AS DecimalPlaces
FROM #tbl_temp;

执行后,150.13对应的DecimalPlaces为2,250.1463对应的为4,符合预期。

方法二:数学计算法

利用MONEY类型的精度特性(最多4位小数),通过整数取余判断末尾有效位数:

SELECT 
    Amount,
    CASE
        -- 整数情况,小数位数为0
        WHEN Amount = FLOOR(Amount) THEN 0
        ELSE 
            CASE 
                -- 乘以10000后取余10不为0,说明第4位小数有效
                WHEN (Amount * 10000) % 10 <> 0 THEN 4
                -- 乘以1000后取余10不为0,说明第3位小数有效
                WHEN (Amount * 1000) % 10 <> 0 THEN 3
                -- 乘以100后取余10不为0,说明第2位小数有效
                WHEN (Amount * 100) % 10 <> 0 THEN 2
                -- 乘以10后取余10不为0,说明第1位小数有效
                WHEN (Amount * 10) % 10 <> 0 THEN 1
                ELSE 0
            END
    END AS DecimalPlaces
FROM #tbl_temp;

这个方法通过数学运算直接判断有效小数位,避免了字符串转换的潜在问题,结果同样符合预期。

注意:由于MONEY类型的存储特性,无法区分原始输入的150.13和150.1300(两者存储值完全相同),上述方法计算的是有效小数位数(即去掉末尾0后的位数)。

内容的提问来源于stack exchange,提问作者Lins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:10:59