1
imn1 2014-05-29 15:14:37 +08:00 1
转贴网上收集
google中有人这么解决的: >>> from decimal import Decimal >>> n = Decimal('1.555') >>> round(n, 2) Decimal('1.56') 现在使用的方式是: 可以使用str.format来格式化数字实现四舍五入 from decimal import Decimal In [15]: '{:.2f}'.format(Decimal('2.675')) Out[15]: '2.68'' def myround(par,l): temp = 1 for i in range(l): temp*=10 v = int((par+0.5/temp)*temp) / temp return v i = 1.25 print(myround(i,1)) i = 1.245 print(myround(i,2)) i = 1.21 print(myround(i,1)) i = 1.249 print(myround(i,2)) ---- 1.3 1.25 1.2 1.25 |
3
riaqn 2014-05-29 15:30:15 +08:00 2
|
4
imn1 2014-05-29 16:28:42 +08:00
@forreal 这个是浮点数精度问题,例如0.5实际上是0.49xxxxxxxxxxxxxx,四舍五入当然就是用了“舍”,
0.5只是字面精度,所以上面用了字串方式处理也是合理的 |
5
forreal OP |
6
imn1 2014-05-29 17:09:23 +08:00
还真是呢,之前都是看,保存笔记,没怎么验证,实际应用也很少用到四舍五入
|
7
lynx 2014-05-29 18:47:00 +08:00
In [1]: import math
In [2]: math.ceil(0.5) Out[2]: 1 |
8
forreal OP |
9
hahastudio 2014-05-29 21:05:52 +08:00 3
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import decimal >>> a = decimal.Decimal("0.5") >>> decimal.getcontext().rounding = decimal.ROUND_UP >>> print round(a) 1.0 感觉 @riaqn 是正解,是Python 3的round函数对策略做了调整 这个取整是“四舍六入五留双” http://zh.wikipedia.org/zh-cn/%E6%95%B0%E5%80%BC%E4%BF%AE%E7%BA%A6 我记得第一次见到这种取整规则是在大物实验上= = |
10
rrfeng 2014-05-29 21:26:16 +08:00
math 里好像有来着
|
11
forreal OP @hahastudio
涨知识了 |
12
SimbaPeng 2017-07-13 12:50:57 +08:00
上面都没说到关键点,你这个代码绝对可以实现标准的四舍五入不丢失精度,不过为什么你没有得到 1,是因为 round 函数如果省略掉第二个参数将会永远返回 int 类型,而你的 a 是 Decimal 对象,所以你要这样写才能得到 1:
print(round(a, 0)) |