|
发表于 2025-2-18 12:59:24
|
显示全部楼层
您的代码有诸多问题,包括数字分组逻辑错误、小数精度处理、浮点数计算的取整问题等。下面我提供一个简化且修正的版本,能够正确处理小数部分转换的问题。
- from decimal import Decimal
- def num_to_rmb(num):
- # 定义数字对应的大写汉字
- num_dict = {0: '零', 1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖'}
- unit_dict = ['', '拾', '佰', '仟']
- big_unit = ['', '万', '亿', '兆']
- # 转换为Decimal确保高精度
- num = Decimal(num).quantize(Decimal("0.01")) # 保留两位小数,避免浮点数误差
- integer_part, decimal_part = str(num).split('.')
- # 处理小数部分
- jiao = int(decimal_part[0])
- fen = int(decimal_part[1])
- decimal_result = ""
- if jiao != 0:
- decimal_result += num_dict[jiao] + "角"
- if fen != 0:
- decimal_result += num_dict[fen] + "分"
- if not decimal_result:
- decimal_result = "整"
- # 处理整数部分
- integer_result = ""
- if int(integer_part) == 0:
- integer_result = "零元"
- else:
- groups = []
- while integer_part:
- groups.append(integer_part[-4:])
- integer_part = integer_part[:-4]
- for i, group in enumerate(groups):
- group_result = ""
- zero_flag = False # 用来标记连续的零
- for j, digit in enumerate(group.zfill(4)):
- digit = int(digit)
- if digit == 0:
- if not zero_flag:
- group_result += "零"
- zero_flag = True
- else:
- zero_flag = False
- group_result += num_dict[digit] + unit_dict[3 - j]
- group_result = group_result.rstrip("零")
- if group_result:
- integer_result = group_result + big_unit[i] + integer_result
- integer_result += "元"
- # 拼接最后结果
- return integer_result + decimal_result
- # 测试
- print(num_to_rmb(123456789876543.51)) # 壹拾贰万叁仟肆佰伍拾陆亿柒仟捌佰玖拾捌万柒仟陆佰伍拾叁元伍角壹分
- print(num_to_rmb(10302450789002.51)) # 壹拾万叁仟零贰亿肆仟伍佰零柒万捌仟玖佰零贰元伍角壹分
复制代码
您可以直接复制这段代码进行测试,如果您有需要修改或扩展的需求,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|