写个类实现浮点数,四舍五入,不足位以0补足
写了个类实现浮点数,四舍五入,不足位以0补足,大伙帮忙试试有没有bug,代码如下:# coding:utf-8
class CheckNumber:
"""需要输入两个参数,一个浮点数,一个位数。检查浮点数小数位,输入要保留几位小数,
小数位大于要保留的位数,进行四舍五入,小于要保留位数,小数后面加0,默认不保留小数位。"""
def __init__(self, nums=0.0, decimal_digits=0):
self.nums = nums
self.decimal_digits = decimal_digits
@staticmethod
def round_number(nums, decimal_digits=0):
# 以小数点为分隔符,将浮点数整数部分和小数部分分开
nums_list = str(nums).split('.')
temp_nums = nums_list
# 只保留整数
if decimal_digits == 0:
if int(temp_nums) < 5:
nums = nums_list
return nums
else:
fist_nums = nums_list
# 判断是否为负数
if fist_nums == '-':
fist_nums = '-' + str(abs(int(fist_nums)) + 1)
return fist_nums
else:
fist_nums = int(fist_nums) + 1
return fist_nums
# 检查保留几位小数
if decimal_digits > 0:
if len(temp_nums) > decimal_digits:
temp_nums_01 = temp_nums
if int(temp_nums_01[-1]) < 5:
nums = nums_list + '.' + temp_nums_01
return nums
else:
temp_nums_02 = str(int(temp_nums_01) + 1)
nums = nums_list + '.' + temp_nums_02
return nums
else:
flag = decimal_digits - len(temp_nums)
nums_01 = ''
while flag:
nums_01 = nums_01 + '0'
flag -= 1
nums = str(nums) + nums_01
return nums
{:5_97:} 问题:
a = CheckNumber(2.951, 2) # 只要小数部分第n位大于4,保留n位小数就有bug
print(a.round_number(a.nums, a.decimal_digits))
输出:
2.96
bug位于代码33行:
if decimal_digits > 0:
if len(temp_nums) > decimal_digits:
temp_nums_01 = temp_nums
if int(temp_nums_01[-1]) < 5: <--- 应该是if int(temp_nums[-1]) < 5
nums = nums_list + '.' + temp_nums_01
return nums
else:
temp_nums_02 = str(int(temp_nums_01) + 1)
nums = nums_list + '.' + temp_nums_02
return nums
如果是temp_nums_01[-1]的话,相当于保留两位小数就根据第二位四舍五入,但显然应该是根据第三位四舍五入 鱼cpython学习者 发表于 2023-1-29 14:06
问题:
bug位于代码33行:
{:5_109:}非常感谢你能抽空帮我测试一下代码。
不过你这样写也有bug,你这样写的话输入2.9846,保留两位小数就变成了2.99了。
这里我改成了:if int(temp_nums) < 5: 更新后的代码:# coding:utf-8
class CheckNumber:
"""需要输入两个参数,一个浮点数,一个位数。检查浮点数小数位,输入要保留几位小数,
小数位大于要保留的位数,进行四舍五入,小于要保留位数,小数后面加0,默认不保留小数位。"""
def __init__(self, nums=0.0, decimal_digits=0):
self.nums = nums
self.decimal_digits = decimal_digits
@staticmethod
def round_number(nums, decimal_digits=0):
# 以小数点为分隔符,将浮点数整数部分和小数部分分开
nums_list = str(nums).split('.')
temp_nums = nums_list
# 只保留整数
if decimal_digits == 0:
if int(temp_nums) < 5:
nums = nums_list
return nums
else:
fist_nums = nums_list
# 判断是否为负数
if fist_nums == '-':
fist_nums = '-' + str(abs(int(fist_nums)) + 1)
return fist_nums
else:
fist_nums = int(fist_nums) + 1
return fist_nums
# 检查保留几位小数
if decimal_digits > 0:
if len(temp_nums) > decimal_digits:
temp_nums_01 = temp_nums
if int(temp_nums) < 5:
nums = nums_list + '.' + temp_nums_01
return nums
else:
temp_nums_02 = str(int(temp_nums_01) + 1)
nums = nums_list + '.' + temp_nums_02
return nums
else:
flag = decimal_digits - len(temp_nums)
nums_01 = ''
while flag:
nums_01 = nums_01 + '0'
flag -= 1
nums = str(nums) + nums_01
return nums
页:
[1]