lywxc168 发表于 2023-1-5 00:02:37

python3 列表中的浮点数能否保留2位小数

"""
【操作】要求输入员工的薪资,若薪资小于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 人
录入薪资:
平均薪资: 3.00

lassiter 发表于 2023-1-5 01:00:41

你的问题都可以先百度,一般都会有答案。https://blog.csdn.net/weixin_43301333/article/details/117289249

使用round()函数

lywxc168 发表于 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位,要不你把代码发上来我看看究竟哪儿的问题?谢谢了!

lywxc168 发表于 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

chinajz 发表于 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 人
录入薪资:
平均薪资: 2.50

chinajz 发表于 2023-1-5 09:22:26

如果不足两位,不补0,超过2位,保留两位,程序没问题的,只是感觉而已:
请输入员工的薪资(按Q或q结束)1.06666
请输入员工的薪资(按Q或q结束)3.4
请输入员工的薪资(按Q或q结束)5.6777
请输入员工的薪资(按Q或q结束)q
录入完成,退出
员工人数: 总计 3 人
录入薪资:
平均薪资: 3.38

lywxc168 发表于 2023-1-5 11:37:37

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

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

我也感觉是这个问题,输入整数float()函数默认是1位小数。不足两位小数,还没想到增加到 X.00 两位小数的方法。
暂时留着,看看其他人如何解决

isdkz 发表于 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}')

lywxc168 发表于 2023-1-5 20:23:09

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

这样 ...

感谢你,终于达成目的了。但是无法给你设置成最佳答案啊。我新手,才学习。

isdkz 发表于 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}')

lywxc168 发表于 2023-1-5 20:31:25

isdkz 发表于 2023-1-5 20:25
为什么不能给我最佳答案?

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

不知道图片怎么设置啊

lywxc168 发表于 2023-1-5 20:35:46

在有代码的那里最佳答案是图片,我不知道怎么处理。请原谅……

isdkz 发表于 2023-1-6 16:02:12

lywxc168 发表于 2023-1-5 20:35
在有代码的那里最佳答案是图片,我不知道怎么处理。请原谅……

问题不大,我把最佳答案那个的内容改一下就好

lassiter 发表于 2023-1-8 01:24:39

虽然你已经有了最佳答案,但还是不建议用魔法方法,因为你懂魔改这个词吧,不管啥东西,魔改的多了就连你自己都不知道这个结果怎么得到的。

lywxc168 发表于 2023-1-8 08:08:36

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

谢谢指导!我刚起步学习,好多知识需要掌握的……
页: [1]
查看完整版本: python3 列表中的浮点数能否保留2位小数