鱼C论坛

 找回密码
 立即注册
查看: 1625|回复: 15

[已解决]format函数的四舍五入规则是什么

[复制链接]
发表于 2020-2-6 13:24:10 | 显示全部楼层 |阅读模式

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

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

x
  1. num = 123.895
  2. str1 = format(num, '0.2f')
  3. print(str1)
复制代码

这段代码输出的结果是:123.89,为什么不是123.90呢?
最佳答案
2020-2-6 14:14:20
一世长安呢 发表于 2020-2-6 14:13
上面这段代码在保留两位小数的情况下,第三位数字为5,则被舍去;但是如果小数位第4位是5的话,小数位 ...

不是。如果小数没有第四位则舍去 5,否则向前一位进一。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 13:27:17 | 显示全部楼层
本帖最后由 zltzlt 于 2020-2-6 13:44 编辑

看错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 13:39:08 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:27
format 是直接将多余的小数位数舍去。所以 format(1.235, '0.2f')、format(1.232, '0.2f') 和 format(1.238 ...
  1. >>> print(format(1.234, '0.2f'))
  2. 1.23
  3. >>> print(format(1.235, '0.2f'))
  4. 1.24
复制代码

我的python版本是3.7.1的,在控制台使用format函数输出的结果进行了四舍五入,这是为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 13:50:14 | 显示全部楼层
一世长安呢 发表于 2020-2-6 13:39
我的python版本是3.7.1的,在控制台使用format函数输出的结果进行了四舍五入,这是为什么?

搞错了。format() 遇到五舍去,遇到六进一
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 14:01:25 | 显示全部楼层
实际上是python浮点数精度的问题。计算机内部是以二进制表示数字的,但每一个十进制的浮点数并不都是有相对应的二进制值,有些只能近似的表达。
123.895实际的值可以这样看一下。
  1. >>> import decimal
  2. >>> decimal.Decimal(123.895)
  3. Decimal('123.8949999999999960209606797434389591217041015625')
复制代码

因为小数点后第三位是4,所以就舍去了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2020-2-6 14:04:20 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:50
搞错了。format() 遇到五舍去,遇到六进一

能不能介绍一下 format()?我只听说过 str.format()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 14:05:29 | 显示全部楼层
一个账号 发表于 2020-2-6 14:04
能不能介绍一下 format()?我只听说过 str.format()

format() 不常用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 14:06:11 | 显示全部楼层

那你也跟我说一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 14:13:30 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:50
搞错了。format() 遇到五舍去,遇到六进一
  1. >>> print(format(123.895, '0.2f'))
  2. 123.89
  3. >>> print(format(123.8955,' 0.2f'))
  4. 123.90
复制代码

上面这段代码在保留两位小数的情况下,第三位数字为5,则被舍去;但是如果小数位第4位是5的话,小数位结果就变成了.90
  1. >>> print(format(123.896,'0.2f'))
  2. 123.90
复制代码

在看这一段代码,第三位是6,结果直接进1,变成123.90
以上面的代码为例,如果第三位是6就进一,如果是5就舍去。当第四位小数是5时,往前进一,如果第三位小数加到了6就继续进一
可不可以这样理解呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 14:14:20 | 显示全部楼层    本楼为最佳答案   
一世长安呢 发表于 2020-2-6 14:13
上面这段代码在保留两位小数的情况下,第三位数字为5,则被舍去;但是如果小数位第4位是5的话,小数位 ...

不是。如果小数没有第四位则舍去 5,否则向前一位进一。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 14:19:05 | 显示全部楼层
zltzlt 发表于 2020-2-6 13:50
搞错了。format() 遇到五舍去,遇到六进一
  1. >>> print(format(123.8955,  '0.3f'))
  2. 123.895
  3. >>> print(format(123.89454,  '0.3f'))
  4. 123.895
复制代码

我尝试了一下上面的代码,只保留三位小数,运行结果都是一样的,如果按照逢六进一,遇到五舍去,第二段的代码应该是123.894啊,但是它变成了123.895
那是不是可以理解
(如果实际小数位数比需要保留的位数多一位,逢六进一,遇到五舍去)
(如果实际小数位数比需要保留的位数多二位或者更多,就按照四舍五入来呢)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 14:21:41 | 显示全部楼层
一个账号 发表于 2020-2-6 14:06
那你也跟我说一下

这是我有道云的笔记,你可以看一下
QQ浏览器截图20200206142054.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 14:25:44 | 显示全部楼层
本帖最后由 一世长安呢 于 2020-2-6 14:26 编辑

http://note.youdao.com/noteshare?id=3788ceb6b7724d2ac38c32804e9ec3fb&sub=88BFB4253029465F83C8539C627602D9
@一个账号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 14:39:00 | 显示全部楼层
一世长安呢 发表于 2020-2-6 14:25
http://note.youdao.com/noteshare?id=3788ceb6b7724d2ac38c32804e9ec3fb&sub=88BFB4253029465F83C8539C627 ...

python是遵循四舍五入的原则的
只不过这里又涉及到数据在计算机中的存储问题
例如 你所说的123.895 在Python中实际保存在计算中为123.8949999999999960209606797434389591217041015625(见5楼)
自然当为2位小数时按照123.8949999999999960209606797434389591217041015625来说就是123.89
但是有的时候遇到末尾为5的情况 在Python中又有其他情况
例如 1.235 保存在计算机为1.2350000000000000976996261670137755572795867919921875
当为2位小数时按照1.2350000000000000976996261670137755572795867919921875来说就是1.24
具体可以用5楼的代码来看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-6 14:41:02 | 显示全部楼层
一世长安呢 发表于 2020-2-6 14:25
http://note.youdao.com/noteshare?id=3788ceb6b7724d2ac38c32804e9ec3fb&sub=88BFB4253029465F83C8539C627 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 14:46:24 | 显示全部楼层
冬雪雪冬 发表于 2020-2-6 14:01
实际上是python浮点数精度的问题。计算机内部是以二进制表示数字的,但每一个十进制的浮点数并不都是有相对 ...

感谢大佬团队的指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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