鱼C论坛

 找回密码
 立即注册
查看: 3206|回复: 14

[已解决]python3 列表中的浮点数能否保留2位小数

[复制链接]
发表于 2023-1-5 00:02:37 | 显示全部楼层 |阅读模式

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

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

x
"""
【操作】要求输入员工的薪资,若薪资小于0则重新输入。
最后打印出录入员工的数量和薪资明细,以及平均薪资
"""
empNum = 0
salarySum = 0
salarys = []
while True:
        s = input("请输入员工的薪资(按Q或q结束)")
        if s.upper() == 'Q':
                print("录入完成,退出")
                break
        if float(s) < 0:
                continue
        empNum += 1
        salarys.append(float(s))
        salarySum += float(s)
print(f'员工人数: 总计 {empNum} 人')
print('录入薪资: ',salarys)
print(f'平均薪资: {salarySum/empNum:.2f}')


我想让录入薪资的列表各元素保留2位小数(不能是字符串),能否实现?

= RESTART: D:\Users\Administrator\Desktop\新建 文本文档.py
请输入员工的薪资(按Q或q结束)1
请输入员工的薪资(按Q或q结束)2
请输入员工的薪资(按Q或q结束)3
请输入员工的薪资(按Q或q结束)4
请输入员工的薪资(按Q或q结束)5
请输入员工的薪资(按Q或q结束)q
录入完成,退出
员工人数: 总计 5 人
录入薪资:  [1.0, 2.0, 3.0, 4.0, 5.0]
平均薪资: 3.00
最佳答案
2023-1-5 20:25:00
本帖最后由 isdkz 于 2023-1-6 17:08 编辑
lywxc168 发表于 2023-1-5 11:37
引用:如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:

我也感觉是这个问题, ...


他的输出形式是由底层的C代码来决定的,既然 1.00 和 1.0 的值都一样,他就没必要显示 1.00,

这样显得有点多余,你在 python 中 print 一下 1.00 你就可以看到输出的结果会变成 1.0,

>>> print(1.00)
1.0


当然,如果你对 c 语言比较熟悉的话,你可以去修改 python 的源码再重新编译,以达到你想要的输出格式,

除此之外 python 也提供了相应的接口,可以让我们改变一些默认的行为,那就是魔法方法。

其中 __str__ 就是在输出的时候会被调用的魔法方法,你可以通过重写这个魔法方法改变它默认的输出行为。

对于你的诉求,通过重写列表的 __str__ 方法来实现
class Nlist(list):
    def __str__(self):
        return f'[{", ".join(map(lambda x: f"{x:.2f}", self))}]'
# 一、新加上面几行代码

empNum = 0
salarySum = 0
salarys = Nlist()             # 二、改了这里
while True:
        s = input("请输入员工的薪资(按Q或q结束)")
        if s.upper() == 'Q':
                print("录入完成,退出")
                break
        if float(s) < 0:
                continue
        empNum += 1
        salarys.append(float(s))
        salarySum += float(s)
print(f'员工人数: 总计 {empNum} 人')
print('录入薪资: ',salarys)
print(f'平均薪资: {salarySum/empNum:.2f}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-5 01:00:41 | 显示全部楼层
你的问题都可以先百度,一般都会有答案。https://blog.csdn.net/weixin_43301333/article/details/117289249

使用round()函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-5 07:12:51 | 显示全部楼层
lassiter 发表于 2023-1-5 01:00
你的问题都可以先百度,一般都会有答案。https://blog.csdn.net/weixin_43301333/article/details/11728924 ...

试过了,如果输入的是整数,float()函数会自动添加1位小数,即使使用round()函数,当输入值为整数时,依然列表中的浮点数小数位数为1位,要不你把代码发上来我看看究竟哪儿的问题?谢谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-5 07:18:43 | 显示全部楼层
lassiter 发表于 2023-1-5 01:00
你的问题都可以先百度,一般都会有答案。https://blog.csdn.net/weixin_43301333/article/details/11728924 ...

我曾尝试修改代码如下,结果列表中的数据成了字符串了
empNum = 0
salarySum = 0
salarys = []
while True:
        s = input("请输入员工的薪资(按Q或q结束)")
        if s.upper() == 'Q':
                print("录入完成,退出")
                break
        if float(s) < 0:
                continue
        empNum += 1
        s = float(s)
        s = format(s, '.2f')
        salarys.append(s)
        salarySum += float(s)
print(f'员工人数: 总计 {empNum} 人')
print('录入薪资: ',salarys)
print(f'平均薪资: {salarySum/empNum:.2f}')

运行结果:

= RESTART: D:\Users\Administrator\Desktop\break and continue.py
请输入员工的薪资(按Q或q结束)1
请输入员工的薪资(按Q或q结束)2
请输入员工的薪资(按Q或q结束)3
请输入员工的薪资(按Q或q结束)4
请输入员工的薪资(按Q或q结束)5
请输入员工的薪资(按Q或q结束)q
录入完成,退出
员工人数: 总计 5 人
录入薪资:  ['1.00', '2.00', '3.00', '4.00', '5.00']
平均薪资: 3.00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 09:05:35 | 显示全部楼层
salarys.append(float('%.2f'%float(s)))

请输入员工的薪资(按Q或q结束)1
请输入员工的薪资(按Q或q结束)2
请输入员工的薪资(按Q或q结束)3
请输入员工的薪资(按Q或q结束)4
请输入员工的薪资(按Q或q结束)q
录入完成,退出
员工人数: 总计 4 人
录入薪资:  [1.0, 2.0, 3.0, 4.0]
平均薪资: 2.50
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 09:22:26 | 显示全部楼层
如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:
请输入员工的薪资(按Q或q结束)1.06666
请输入员工的薪资(按Q或q结束)3.4
请输入员工的薪资(按Q或q结束)5.6777
请输入员工的薪资(按Q或q结束)q
录入完成,退出
员工人数: 总计 3 人
录入薪资:  [1.07, 3.4, 5.68]
平均薪资: 3.38
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-5 11:37:37 | 显示全部楼层
chinajz 发表于 2023-1-5 09:22
如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:
请输入员工的薪资(按Q或q结束)1. ...

引用:如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:

我也感觉是这个问题,输入整数float()函数默认是1位小数。不足两位小数,还没想到增加到 X.00 两位小数的方法。
暂时留着,看看其他人如何解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 16:08:49 | 显示全部楼层
本帖最后由 isdkz 于 2023-1-6 17:09 编辑
lywxc168 发表于 2023-1-5 11:37
引用:如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:

我也感觉是这个问题, ...


他的输出形式是由底层的C代码来决定的,既然 1.00 和 1.0 的值都一样,他就没必要显示 1.00,

这样显得有点多余,你在 python 中 print 一下 1.00 你就可以看到输出的结果会变成 1.0,

>>> print(1.00)
1.0


当然,如果你对 c 语言比较熟悉的话,你可以去修改 python 的源码再重新编译,以达到你想要的输出格式,

除此之外 python 也提供了相应的接口,可以让我们改变一些默认的行为,那就是魔法方法。

其中 __str__ 就是在输出的时候会被调用的魔法方法,你可以通过重写这个魔法方法改变它默认的输出行为。

对于你的诉求,通过重写列表的 __str__ 方法来实现
class Nlist(list):
    def __str__(self):
        return f'[{", ".join(map(lambda x: f"{x:.2f}", self))}]'
# 一、新加上面几行代码

empNum = 0
salarySum = 0
salarys = Nlist()             # 二、改了这里
while True:
        s = input("请输入员工的薪资(按Q或q结束)")
        if s.upper() == 'Q':
                print("录入完成,退出")
                break
        if float(s) < 0:
                continue
        empNum += 1
        salarys.append(float(s))
        salarySum += float(s)
print(f'员工人数: 总计 {empNum} 人')
print('录入薪资: ',salarys)
print(f'平均薪资: {salarySum/empNum:.2f}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-1-5 20:23:09 | 显示全部楼层
isdkz 发表于 2023-1-5 16:08
他的输出形式是由底层的C代码来决定的,既然 1.00 和 1.0 的值都一样,他就没必要显示 1.00,

这样 ...

感谢你,终于达成目的了。但是无法给你设置成最佳答案啊。我新手,才学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-5 20:25:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-1-6 17:08 编辑
lywxc168 发表于 2023-1-5 11:37
引用:如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:

我也感觉是这个问题, ...


他的输出形式是由底层的C代码来决定的,既然 1.00 和 1.0 的值都一样,他就没必要显示 1.00,

这样显得有点多余,你在 python 中 print 一下 1.00 你就可以看到输出的结果会变成 1.0,

>>> print(1.00)
1.0


当然,如果你对 c 语言比较熟悉的话,你可以去修改 python 的源码再重新编译,以达到你想要的输出格式,

除此之外 python 也提供了相应的接口,可以让我们改变一些默认的行为,那就是魔法方法。

其中 __str__ 就是在输出的时候会被调用的魔法方法,你可以通过重写这个魔法方法改变它默认的输出行为。

对于你的诉求,通过重写列表的 __str__ 方法来实现
class Nlist(list):
    def __str__(self):
        return f'[{", ".join(map(lambda x: f"{x:.2f}", self))}]'
# 一、新加上面几行代码

empNum = 0
salarySum = 0
salarys = Nlist()             # 二、改了这里
while True:
        s = input("请输入员工的薪资(按Q或q结束)")
        if s.upper() == 'Q':
                print("录入完成,退出")
                break
        if float(s) < 0:
                continue
        empNum += 1
        salarys.append(float(s))
        salarySum += float(s)
print(f'员工人数: 总计 {empNum} 人')
print('录入薪资: ',salarys)
print(f'平均薪资: {salarySum/empNum:.2f}')

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
lywxc168 + 5 + 5 + 3 太感谢了

查看全部评分

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

使用道具 举报

 楼主| 发表于 2023-1-5 20:31:25 | 显示全部楼层
isdkz 发表于 2023-1-5 20:25
为什么不能给我最佳答案?

不给就算了,还说出来,太伤人了

不知道图片怎么设置啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-5 20:35:46 | 显示全部楼层
在有代码的那里最佳答案是图片,我不知道怎么处理。请原谅……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-6 16:02:12 | 显示全部楼层
lywxc168 发表于 2023-1-5 20:35
在有代码的那里最佳答案是图片,我不知道怎么处理。请原谅……

问题不大,我把最佳答案那个的内容改一下就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 01:24:39 | 显示全部楼层
虽然你已经有了最佳答案,但还是不建议用魔法方法,因为你懂魔改这个词吧,不管啥东西,魔改的多了就连你自己都不知道这个结果怎么得到的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-8 08:08:36 | 显示全部楼层
lassiter 发表于 2023-1-8 01:24
虽然你已经有了最佳答案,但还是不建议用魔法方法,因为你懂魔改这个词吧,不管啥东西,魔改的多了就连你自 ...

谢谢指导!我刚起步学习,好多知识需要掌握的……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 01:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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