如何实现0.01转0.009类小数调整,且处理时避免科学记数法
实现方案
核心思路:全程操作输入的字符串,不转换为浮点类型,从根源避免精度丢失、科学计数法问题
逻辑步骤
- 拆分输入字符串为整数部分、小数部分
- 定位小数部分最后一位非零的有效数字位置
- 根据最后一位有效数字的大小做不同处理:
- 若最后一位有效数字大于1,直接将该位数值减1,移除该位之后的所有末尾0即可
- 若最后一位有效数字等于1,将该位设为0,在末尾追加一位9即可
- 拼接整数部分和处理后的小数部分得到最终结果
参考代码(Python)
def decrease_last_valid_digit(num_str: str) -> str: # 处理负数场景,先剥离符号后续再拼接 sign = "" if num_str.startswith("-"): sign = "-" num_str = num_str.lstrip("-") # 无小数的整数场景 if "." not in num_str: return f"{sign}{str(int(num_str) - 1)}" int_part, dec_part = num_str.split(".", 1) # 定位最后一位有效小数位 last_valid_idx = len(dec_part) - 1 while last_valid_idx >= 0 and dec_part[last_valid_idx] == "0": last_valid_idx -= 1 # 小数部分全为0,等价于整数 if last_valid_idx < 0: return f"{sign}{str(int(int_part) - 1)}" dec_list = list(dec_part) last_digit = int(dec_list[last_valid_idx]) if last_digit > 1: dec_list[last_valid_idx] = str(last_digit - 1) new_dec = "".join(dec_list[:last_valid_idx + 1]) else: dec_list[last_valid_idx] = "0" new_dec = "".join(dec_list[:last_valid_idx + 1]) + "9" return f"{sign}{int_part}.{new_dec}"
效果验证
- 输入
"0.001"→ 输出"0.0009",符合预期 - 输入
"0.005"→ 输出"0.004",符合预期 - 输入
"1.23400"→ 输出"1.233",自动忽略末尾无意义的0 - 输入
"-0.02"→ 输出"-0.01",适配负数场景
内容的提问来源于stack exchange,提问作者SirPing
相关产品推荐
相关产品推荐

