如何在Python中将值舍入到一定数量的小数位?

时间:2013-08-16 20:30:42

标签: python

给定一个数字,我想找到最接近2,5,6或0的第百位的值。

是否存在执行此操作的舍入功能或如何以编程方式执行此操作?

例如,2.567会给2.566,2.5652会给2.565,2.5613会给2.562。

3 个答案:

答案 0 :(得分:1)

你的问题很不清楚,但希望这样的事情会让你朝着正确的方向前进:

vals   = [ 0, 2, 5, 6 ]
number = 4.296

distances = [ abs(x - number) for x in vals]
closest   = vals[distances.index(min(distances))]

这样可以获得number最接近的列表中的值。

答案 1 :(得分:1)

有一种称为Python文档的东西:

  

round( number [,ndigits]

     

返回浮点值编号   舍入到小数点后的数字位数。如果ndigits是   省略,默认为零。结果是一个浮点数。   将值四舍五入为函数减去10的最接近倍数   ndigits;如果两个倍数相等,则舍入就完成了   从0开始(例如,round(0.5)为1.0,round(-0.5)为-1.0)。

     

注意浮点数的round()行为可能会令人惊讶:for   例如,round(2.675,2)给出2.67而不是预期的2.68。这个   这不是一个错误:它是大多数小数部分的结果   不能完全表示为浮点数。请参阅浮点   算术:问题和限制以获取更多信息。

因此,舍入可以简单如下:

print round(2.235, 2)

# Output: 2.24

从这里开始,您可以编写一些简单的代码来测量百分位数距离最近的距离为2,5,6,0。

http://docs.python.org/2/library/functions.html#round

答案 2 :(得分:0)

要从第100位开始分离小数部分,您可以通过乘以10来提升num,然后将整数与小数部分分开。例如,3.14159将变为31.4159,整个部分将为31,小数部分将为0.4159。

现在,您可以使用bisect.bisect来选择最接近小数部分的数字(例如0,2,5或6):

import bisect
def closest_hundredth(num, digits=[0, 2, 5, 6]):
     digits = [d/10.0 for d in digits] + [1.0]
     num *= 10
     whole = int(num)
     frac = num-whole
     boundary_vals = [(digits[i]+digits[i+1])/2 for i in range(len(digits)-1)]
     idx = bisect.bisect(boundary_vals, frac)
     rounded_frac = digits[idx]
     new_num = whole + rounded_frac
     new_num /= 10
     return new_num

tests = [
     (3.14159, 3.15),
     (3.156, 3.16),
     (3.13159, 3.12),
     (0, 0),
     (0.01, 0.02),
     (0.011, 0.02),
     (0.08, 0.10)
     ]

for num, answer in tests:
     result = closest_hundredth(num)
     assert result == answer

在这里使用bisect.bisect可能有点矫枉过正,因为只有四种选择 - if语句可能更快。但我发现它是一种可读的方式来表达这个想法,而不必编写繁琐的if语句。如果有许多边界值可供选择,它也可以很好地扩展(O(log(n))的复杂度O(n)而不是if-statements