找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4157|回复: 6

[求助] 四舍五入问题

5

主题

8

帖子

8

积分

贫民

积分
8
dhbin 发表于 2017-10-19 21:41:36 | 显示全部楼层 |阅读模式
今天算一个数:9.45*0.9,结果要求四舍五入
笔算可知,9.45*0.9=8.505,四舍五入后得8.51
但是用python算,9.45*0.9=8.50499999999,四舍五入后得8.5
如何解决?
回复

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2017-10-19 22:26:15 | 显示全部楼层
有个简单的办法,用两次round,第一次的位数,比你实际需要的位数大一位即可
round(round(a*b,3),2)
python3.4.4, win10
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
Yong 发表于 2017-10-20 10:53:22 | 显示全部楼层
用 decimal模块;
In [14]: from decimal import Decimal as D

In [15]: D('9.45') * D('0.9')
Out[15]: Decimal('8.505')

点评

还是不行,print (D('9.45') * D('0.9')) 确实显示8.505,不知为何print (round(D('9.45')*D('0.9'),2))仍然是8.5  发表于 2017-11-10 10:29
回复 支持 反对

使用道具 举报

5

主题

8

帖子

8

积分

贫民

积分
8
dhbin  楼主| 发表于 2017-11-10 10:33:48 | 显示全部楼层
上次我是这样做的:print(round(round(9.45*100,0)*9/1000,2))
本来以为自己解决了,但今天又遇到一个:print (round(round(65.35*100,0)*9/1000,2))
应该是58.82,但算出来是58.81,
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-11-10 12:51:30 | 显示全部楼层
dhbin 发表于 2017-11-10 10:33
上次我是这样做的:print(round(round(9.45*100,0)*9/1000,2))
本来以为自己解决了,但今天又遇到一个:pri ...

其具体要求如下(以保留两位小数为例):
(1)要求保留位数的后一位如果是4或者4以下的数字,则舍去, 例如 5.214保留两位小数为5.21。
(2)如果保留位数的后一位如果是6或者6以上的数字,则进上去, 例如5.216保留两位小数为5.22。
(3)如果保留位数的后一位如果是5,且该位数后没有数字。要根据保留位数的那一位决定是舍去还是进入:如果是奇数则进入,如果是偶数则舍去。例如5.215保留两位小数为5.22,5.225保留两位小数为5.22。
(4) 如果保留位数的后一位如果是5,且该位数后有数字。则进上去,例如5.2152保留两位小数为5.22,5.2252保留两位小数为5.23,5.22500001保留两位小数为5.23。
从统计学的角度,“奇进偶舍”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“奇进偶舍”使测量结果受到舍入误差的影响降到最低。
>>> round(0.5)
0
>>> round(0.51)
1
>>> round(10.0/4)
2
>>> round(14.0/4)
4
>>> round(58.815,2)
58.81
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2017-11-10 18:47:55 | 显示全部楼层
楼上正确. 如要简单解决这个问题,可以这样:
a=a+0.0001
round(a,2)
python3.4.4, win10
回复 支持 反对

使用道具 举报

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

本版积分规则

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