Python中RGB转Hex时字典取值一正常一返回None问题排查
RGB转Hex时字典取值返回None的问题解决
自己实现RGB转Hex的函数时,遇到一个奇怪的问题:当r=254时,计算得到的two理论上是14,但用字典的get方法取值时返回None,而另一个变量one的转换却完全正常,大小写不是问题,修改数据类型也没解决。
原代码如下:
def rgb(r, g, b): Rgb_to_Hex = { "0": "0", "1": "1", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7", "8": "8", "9": "9", "10": "A", "11": "B", "12": "C", "13": "D", "14": "E", "15": "F" } one = str(int(r / 16)) two = str(((r / 16) - int(r/16)) * 16) print(two) #two is equal to 14 when r is 254 #three #four #five #six one1 = str(Rgb_to_Hex.get(one)) two2 = str(Rgb_to_Hex.get(two)) print(one1) # Console: F (works) print(two2) # Console: None (doesnt work) return one1 + two2
问题根源
问题出在浮点数运算的精度误差上。比如r=254时,254/16得到的是15.875,int(254/16)是15,两者相减得到0.875,但0.875*16在浮点数计算中可能会得到13.999999999999998而非精确的14。此时转成字符串后是"13.999999999999998",和字典里的键"14"完全不匹配,所以get方法返回None。你看到print(two)显示14,是因为Python在打印时做了近似处理,但变量实际存储的是带精度误差的浮点数字符串。
解决方法
1. 用整数运算替代浮点数运算(推荐)
直接用整数除法//和取模%来计算,完全避免浮点数精度问题:
one = r // 16:直接得到十六进制的高位(整数除法)two = r % 16:直接得到十六进制的低位(取模运算,余数就是低位数值)
2. 优化字典结构
把字典的键改成整数,不用来回转换字符串,代码更简洁高效。
3. 可选:添加RGB值边界处理
确保输入的r/g/b值在0-255之间,避免超出范围的数值导致转换错误。
修改后的代码
def rgb(r, g, b): Rgb_to_Hex = { 0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8", 9: "9", 10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F" } # 确保RGB值在0-255范围内 r = max(0, min(255, r)) g = max(0, min(255, g)) b = max(0, min(255, b)) # 用整数运算计算十六进制高低位 r_one, r_two = r // 16, r % 16 g_one, g_two = g // 16, g % 16 b_one, b_two = b // 16, b % 16 # 拼接结果 return (Rgb_to_Hex[r_one] + Rgb_to_Hex[r_two] + Rgb_to_Hex[g_one] + Rgb_to_Hex[g_two] + Rgb_to_Hex[b_one] + Rgb_to_Hex[b_two])
补充说明
如果不想修改字典的键类型,也可以在计算two时先取整再转字符串:
two = str(int(((r / 16) - int(r/16)) * 16))
但这种方式不如整数运算可靠,还是推荐用//和%的组合。
内容的提问来源于stack exchange,提问作者Sanderdrack
相关产品推荐
相关产品推荐

