鱼C论坛

 找回密码
 立即注册
查看: 2508|回复: 3

[技术交流] 写个类实现浮点数,四舍五入,不足位以0补足

[复制链接]
发表于 2023-1-29 11:53:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了个类实现浮点数,四舍五入,不足位以0补足,大伙帮忙试试有没有bug,代码如下:
  1. # coding:utf-8

  2. class CheckNumber:
  3.     """需要输入两个参数,一个浮点数,一个位数。检查浮点数小数位,输入要保留几位小数,
  4.     小数位大于要保留的位数,进行四舍五入,小于要保留位数,小数后面加0,默认不保留小数位。"""
  5.     def __init__(self, nums=0.0, decimal_digits=0):
  6.         self.nums = nums
  7.         self.decimal_digits = decimal_digits

  8.     @staticmethod
  9.     def round_number(nums, decimal_digits=0):
  10.         # 以小数点为分隔符,将浮点数整数部分和小数部分分开
  11.         nums_list = str(nums).split('.')
  12.         temp_nums = nums_list[1]
  13.         # 只保留整数
  14.         if decimal_digits == 0:
  15.             if int(temp_nums[0]) < 5:
  16.                 nums = nums_list[0]
  17.                 return nums
  18.             else:
  19.                 fist_nums = nums_list[0]
  20.                 # 判断是否为负数
  21.                 if fist_nums[0] == '-':
  22.                     fist_nums = '-' + str(abs(int(fist_nums)) + 1)
  23.                     return fist_nums
  24.                 else:
  25.                     fist_nums = int(fist_nums) + 1
  26.                     return fist_nums
  27.         # 检查保留几位小数
  28.         if decimal_digits > 0:
  29.             if len(temp_nums) > decimal_digits:
  30.                 temp_nums_01 = temp_nums[0:decimal_digits]
  31.                 if int(temp_nums_01[-1]) < 5:
  32.                     nums = nums_list[0] + '.' + temp_nums_01
  33.                     return nums
  34.                 else:
  35.                     temp_nums_02 = str(int(temp_nums_01) + 1)
  36.                     nums = nums_list[0] + '.' + temp_nums_02
  37.                     return nums
  38.             else:
  39.                 flag = decimal_digits - len(temp_nums)
  40.                 nums_01 = ''
  41.                 while flag:
  42.                     nums_01 = nums_01 + '0'
  43.                     flag -= 1
  44.                 nums = str(nums) + nums_01
  45.                 return nums
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-29 14:06:37 | 显示全部楼层
问题:
  1. a = CheckNumber(2.951, 2) # 只要小数部分第n位大于4,保留n位小数就有bug
  2. print(a.round_number(a.nums, a.decimal_digits))

  3. 输出:
  4. 2.96
复制代码

bug位于代码33行:
  1. if decimal_digits > 0:
  2.             if len(temp_nums) > decimal_digits:
  3.                 temp_nums_01 = temp_nums[0:decimal_digits]
  4.                 if int(temp_nums_01[-1]) < 5:    <--- 应该是if int(temp_nums[-1]) < 5
  5.                     nums = nums_list[0] + '.' + temp_nums_01
  6.                     return nums
  7.                 else:
  8.                     temp_nums_02 = str(int(temp_nums_01) + 1)
  9.                     nums = nums_list[0] + '.' + temp_nums_02
  10.                     return nums
复制代码

如果是temp_nums_01[-1]的话,相当于保留两位小数就根据第二位四舍五入,但显然应该是根据第三位四舍五入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-31 11:12:25 | 显示全部楼层
鱼cpython学习者 发表于 2023-1-29 14:06
问题:

bug位于代码33行:

非常感谢你能抽空帮我测试一下代码。
不过你这样写也有bug,你这样写的话输入2.9846,保留两位小数就变成了2.99了。
这里我改成了:
  1. if int(temp_nums[decimal_digits]) < 5:
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-1-31 11:13:05 | 显示全部楼层
更新后的代码:
  1. # coding:utf-8

  2. class CheckNumber:
  3.     """需要输入两个参数,一个浮点数,一个位数。检查浮点数小数位,输入要保留几位小数,
  4.     小数位大于要保留的位数,进行四舍五入,小于要保留位数,小数后面加0,默认不保留小数位。"""
  5.     def __init__(self, nums=0.0, decimal_digits=0):
  6.         self.nums = nums
  7.         self.decimal_digits = decimal_digits

  8.     @staticmethod
  9.     def round_number(nums, decimal_digits=0):
  10.         # 以小数点为分隔符,将浮点数整数部分和小数部分分开
  11.         nums_list = str(nums).split('.')
  12.         temp_nums = nums_list[1]
  13.         # 只保留整数
  14.         if decimal_digits == 0:
  15.             if int(temp_nums[0]) < 5:
  16.                 nums = nums_list[0]
  17.                 return nums
  18.             else:
  19.                 fist_nums = nums_list[0]
  20.                 # 判断是否为负数
  21.                 if fist_nums[0] == '-':
  22.                     fist_nums = '-' + str(abs(int(fist_nums)) + 1)
  23.                     return fist_nums
  24.                 else:
  25.                     fist_nums = int(fist_nums) + 1
  26.                     return fist_nums
  27.         # 检查保留几位小数
  28.         if decimal_digits > 0:
  29.             if len(temp_nums) > decimal_digits:
  30.                 temp_nums_01 = temp_nums[0:decimal_digits]
  31.                 if int(temp_nums[decimal_digits]) < 5:
  32.                     nums = nums_list[0] + '.' + temp_nums_01
  33.                     return nums
  34.                 else:
  35.                     temp_nums_02 = str(int(temp_nums_01) + 1)
  36.                     nums = nums_list[0] + '.' + temp_nums_02
  37.                     return nums
  38.             else:
  39.                 flag = decimal_digits - len(temp_nums)
  40.                 nums_01 = ''
  41.                 while flag:
  42.                     nums_01 = nums_01 + '0'
  43.                     flag -= 1
  44.                 nums = str(nums) + nums_01
  45.                 return nums
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表