我试图在python中找到一些不同的规则。例如;
10.666 = 10.6
10.667 = 10.7
即向下6,向上7。
有没有办法可以用Python做到这一点?
答案 0 :(得分:5)
使用decimal.Decimal
。它内置并调试了各种复杂的舍入规则。
答案 1 :(得分:1)
我不确定你究竟采用了什么样的舍入规则。你能详细说明你的舍入规则吗?
因此我不能说完全正确,但我怀疑你可以将它用作实现模式。
def cround(v):
"""
Round number down at 1st decimal place when the digit in the
3rd decimal place is <= 6, up when >= 7
"""
v *= 10
q = str(round(v, 2))
if int(q[-1]) <= 6:
return int(v) / 10.0
return round(v) / 10.0
NUMS = [
10.666, 10.667, 0.1, 1.0, 10.11, 10.22, 10.06, 10.006, 11.6, 11.7,
10.666123, 10.667123, 10.888, 10.999 ]
for num in NUMS:
print str(num).ljust(11), cround(num)
输出:
10.666 10.6
10.667 10.7
0.1 0.1
1.0 1.0
10.11 10.1
10.22 10.2
10.06 10.0
10.006 10.0
11.6 11.6
11.7 11.7
10.666123 10.6
10.667123 10.7
10.888 10.9
10.999 11.0
答案 2 :(得分:1)
如果要舍入的部分大于或等于其最大值的1/3,那么你想要的是向上舍入,否则向下舍入,那么我相信你可以使用普通round()
函数首先减去⅙*想要的精度:
def my_round(n):
return round(n - .1/6, 1)
>>> print(my_round(10.666))
10.6
>>> print(my_round(10.667))
10.7
答案 3 :(得分:0)
是的,你可以。正如你没有描述规则,但我假设你知道你想要什么,你可以将数字转换为字符串,逐个字符地迭代它,一旦到达字符超过十进制2步。你可以按照你的规则行事。
还有一个builin round
函数,它可以将数字四舍五入到给定的精度。
答案 4 :(得分:0)
这是一种方法(使用simplebias的测试数据)
>>> def cround(v):
... return round(v-2.0/9, 1)+.2
...
>>>
>>> NUMS = [
... 10.666, 10.667, 0.1, 1.0, 10.11, 10.22, 10.06, 10.006, 11.6, 11.7,
... 10.666123, 10.667123, 10.888, 10.999 ]
>>>
>>> for num in NUMS:
... print str(num).ljust(11), cround(num)
...
10.666 10.6
10.667 10.6
0.1 0.1
1.0 1.0
10.11 10.1
10.22 10.2
10.06 10.0
10.006 10.0
11.6 11.6
11.7 11.7
10.666123 10.6
10.667123 10.6
10.888 10.9
10.999 11.0
答案 5 :(得分:-2)
我想让它尽可能简单。
您有三种功能ceil
,floor
,round
。舍入规则如下:
ceil()
向上舍入,表示:
ceil(10.1) = 11
,ceil(10.9) = 11
floor()
向下舍入,表示:
floor(10.1) = 10
,floor(10.9) = 10
round()
取决于您的值(此处,向上(&gt; = 10.5)或向下(&lt; 10.5)),这意味着:
round(10.1) = 10
,round(10.9) = 11
如果您使用ceil
或floor
,首先必须导入数学模块,例如from math import ceil
。
有关详细信息,我建议您在这里查看:Floating Point Arithmetic: Issues and Limitations