首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于非常大的数字,在SQL Server中将基数10转换为基数2

对于非常大的数字,在SQL Server中将基数10转换为基数2
EN

Stack Overflow用户
提问于 2020-04-28 23:26:26
回答 1查看 301关注 0票数 0

在SQL Server2017上,我有一个DECIMAL(38,0)类型的基数为10的数字,我需要将其转换为基数为2的表示形式。

这对于较小的数字可以很好地工作,但对于目标数量级则失败:

代码语言:javascript
复制
DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
WITH A
     AS (SELECT @var1 AS NUMBER, 
                CAST('' AS VARCHAR(125)) AS BITS
         UNION ALL
         SELECT CAST(ROUND(NUMBER / 2, 0, 1) AS DECIMAL(38, 0)),
                CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(125))
         FROM A
         WHERE NUMBER > 0)
     SELECT NUMBER, 
            RIGHT(REPLICATE('0', 125) + CASE
                                            WHEN BITS = ''
                                            THEN '0'
                                            ELSE REVERSE(BITS)
                                        END, 125) AS BIN_VALUE
     FROM A
     WHERE NUMBER = 0;

错误消息显示为Msg 8115, Level 16, State 2, Line 2 Arithmetic overflow error converting expression to data type numeric.

我还尝试了其他方法,但由于原始值的大小,每种方法都失败了。对执行此转换的任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-28 23:43:30

代码语言:javascript
复制
--DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
DECLARE @var1 DECIMAL(38, 0) = 99999567999999999999999999999999999999;
WITH A
AS 
(
    SELECT @var1 AS NUMBER, 
        CAST('' AS VARCHAR(130)) AS BITS
    UNION ALL
    SELECT CAST(
         cast(round(NUMBER*0.1, 0, 1) as decimal(38,0))*5 --high part
            + 
            round(cast('0.'+right(NUMBER, 1) as decimal(10,2))* 5, 0, 1) --low part
         --ROUND(NUMBER * 0.5, 0, 1)
         AS DECIMAL(38, 0)),
         CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(130))
     FROM A
     WHERE NUMBER > 0
)
SELECT NUMBER, 
        RIGHT(REPLICATE('0', 130) + CASE
                                        WHEN BITS = ''
                                        THEN '0'
                                        ELSE REVERSE(BITS)
                                    END, 130) AS BIN_VALUE
FROM A
WHERE NUMBER = 0
option (maxrecursion 0);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61483940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档