如何将带或不带小数部分的double转换为26进制(Base-26)字符串
double类型转26进制(Base-26)字符串实现方案
前置约定
首先明确26进制没有通用标准,转换前先对齐字符映射规则,最常用的两种:
- 通用计算场景:
A~Z对应数值0~25,支持0值、正负数、小数转换 - Excel列名场景:
A~Z对应数值1~26,无0值,仅支持正整数转换
转换核心逻辑
1. 整数部分转换(通用0~25映射)
和常规进制转换逻辑一致,采用除基取余、逆序排列规则:
- 取double的整数部分转为长整型(注意:超过
2^53的整数double无法精确存储,转换前需做合法性校验) - 循环执行:整数除以26,取余数作为下标取对应字符,商作为下一轮计算的输入
- 直到商为0时停止,将收集到的字符逆序拼接,得到整数部分的26进制字符串
2. 小数部分转换
采用乘基取整、顺序排列规则:
- 取double减去整数部分后的剩余小数
- 循环执行:小数乘以26,取整数部分作为下标取对应字符,剩余的小数部分作为下一轮计算的输入
- 直到小数部分为0,或达到预设的精度上限(比如保留8位小数)时停止,将收集到的字符顺序拼接,前面加小数点和整数部分合并
实用技巧与快捷实现
- 预定义字符映射表:直接写死字符数组
const char base26[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";,余数直接当下标取值,不需要做ASCII码偏移计算,减少出错概率 - 负数处理:先单独记录符号位,对绝对值做转换完成后,再在字符串开头拼接
-即可,不用修改核心转换逻辑 - 精度控制:小数部分默认设置4~8位的截断上限,避免无限循环小数导致程序卡死;大整数转换前先判断是否超过
2^53,超出的话提前抛出精度告警 - Excel列名变体适配:如果是1~26映射的场景,每次取余前先给整数减1,即可避免出现0值,不用额外调整映射表
- 快捷代码示例(Python):
def double_to_base26(num, precision=6): base_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 处理负数 sign = "-" if num < 0 else "" num = abs(num) # 处理整数部分 integer_part = int(num) int_str = "" if integer_part == 0: int_str = base_chars[0] else: while integer_part > 0: remainder = integer_part % 26 int_str = base_chars[remainder] + int_str integer_part = integer_part // 26 # 处理小数部分 decimal_part = num - int(num) dec_str = "" if decimal_part > 0 and precision > 0: dec_str = "." for _ in range(precision): decimal_part *= 26 dec_int = int(decimal_part) dec_str += base_chars[dec_int] decimal_part -= dec_int if decimal_part == 0: break return sign + int_str + dec_str
调用示例:double_to_base26(123.25) 输出结果为 ET.GN
内容的提问来源于stack exchange,提问作者R2D2
相关产品推荐
相关产品推荐

