Python如何实现任意量级数值动态将最后一位有效数字减1
实现思路与代码
结合你给出的3个示例,存在两种符合条件的实现逻辑,你可以根据自身实际需求选择:
方案1:整数统一减1,两位小数浮点数统一减0.01
如果你的使用场景只有两位小数浮点数、整数两类输入,该方案实现最简洁:
def adjust_num(num): if isinstance(num, float): # 保留两位小数避免浮点精度问题 return round(num - 0.01, 2) elif isinstance(num, int): return num - 1 else: raise TypeError("仅支持int和float类型输入") # 测试 print(adjust_num(4.16)) # 输出 4.15 print(adjust_num(416)) # 输出 415 print(adjust_num(41600)) # 输出 41599
方案2:通用规则(最右侧非零位减1,右侧所有位置9)
如果你的输入可能有更多位数、更多小数位,比如416000要转415999、4.1600要转4.1599,可以用字符串处理的方式实现通用规则,避开浮点数精度问题:
def adjust_num(num): num_str = str(num) # 处理带小数点的情况 if '.' in num_str: integer_part, decimal_part = num_str.split('.', 1) full_str = integer_part + decimal_part dot_pos = len(integer_part) else: full_str = num_str dot_pos = len(full_str) # 找最右侧非零字符的位置 right_non_zero_idx = len(full_str) - 1 while right_non_zero_idx >= 0 and full_str[right_non_zero_idx] == '0': right_non_zero_idx -= 1 if right_non_zero_idx < 0: return num # 拼接新的字符串 new_full = list(full_str) new_full[right_non_zero_idx] = str(int(new_full[right_non_zero_idx]) - 1) for i in range(right_non_zero_idx + 1, len(new_full)): new_full[i] = '9' new_full = ''.join(new_full) # 还原小数点 if dot_pos < len(new_full): result_str = new_full[:dot_pos] + '.' + new_full[dot_pos:] else: result_str = new_full # 转回对应类型 return float(result_str) if '.' in num_str else int(result_str) # 测试 print(adjust_num(4.16)) # 输出 4.15 print(adjust_num(416)) # 输出 415 print(adjust_num(41600)) # 输出 41599 print(adjust_num(4.1600)) # 输出 4.1599 print(adjust_num(416000)) # 输出 415999
内容的提问来源于stack exchange,提问作者AI92
相关产品推荐
相关产品推荐

