Python设置小数位数范围而不舍入?

Python设置小数位数范围而不舍入?,python,python-2.7,Python,Python 2.7,如何获取一个float变量,并在没有round()的情况下控制float的范围?比如说 w = float(1.678) 我想取x,并从中得到以下变量 x = 1.67 y = 1.6 z = 1 如果我使用相应的四舍五入方法: x = round(w, 2) # With round I get 1.68 y = round(y, 1) # With round I get 1.7 z = round(z, 0) # With round I get 2.0 它会把数字四舍五入,改变到

如何获取一个float变量,并在没有round()的情况下控制float的范围?比如说

w = float(1.678)
我想取x,并从中得到以下变量

x = 1.67
y = 1.6
z = 1
如果我使用相应的四舍五入方法:

x = round(w, 2) # With round I get 1.68 
y = round(y, 1) # With round I get 1.7
z = round(z, 0) # With round I get 2.0

它会把数字四舍五入,改变到对我没有用的程度。我知道这是圆的要点,它工作正常。我如何获得x、y、z变量中所需的信息,并且仍然能够以浮点格式在其他等式中使用它们?

如果您只需要控制格式中的精度

pi = 3.14159265
format(pi, '.3f') #print 3.142 # 3 precision after the decimal point
format(pi, '.1f') #print 3.1
format(pi, '.10f') #print 3.1415926500, more precision than the original
如果需要在浮点运算中控制精度

import decimal
decimal.getcontext().prec=4 #4 precision in total
pi = decimal.Decimal(3.14159265)
pi**2 #print Decimal('9.870') whereas '3.142 squared' would be off
--编辑--

没有“四舍五入”,因此截断了数字

import decimal
from decimal import ROUND_DOWN
decimal.getcontext().prec=4
pi*1 #print Decimal('3.142')

decimal.getcontext().rounding = ROUND_DOWN
pi*1 #print Decimal('3.141')

一个超级简单的解决方案是使用字符串

x = float (str (w)[:-1])
y = float (str (w)[:-2])
z = float (str (w)[:-3])
任何浮点库解决方案都需要避开一些舍入,与上述方法相比,使用10的下限/幂来选择小数可能会有点麻烦。

您可以:

def truncate(f, n):
    return math.floor(f * 10 ** n) / 10 ** n
测试:

>>> f=1.923328437452
>>> [truncate(f, n) for n in range(7)]
[1.0, 1.9, 1.92, 1.923, 1.9233, 1.92332, 1.923328]

整数比浮点数/双精度浮点运算速度快,浮点数/双精度浮点运算速度比字符串快。在这种情况下,我试图用这两种方法来争取时间:

  timeit.timeit(stmt = "float(str(math.pi)[:12])", setup = "import math", number = 1000000)
~1.1929605630000424

用于:

~0.3455968870000561


因此,使用math.floor而不是字符串操作是安全的。

[math.floor(w*10**i)/10**i表示范围(3)内的i]
上述注释实际上就是我在本例中使用的注释。我不能接受它作为答案,因为它是作为评论发布的。非常感谢。当我将pi切换到示例中的值时,示例的格式部分将数字舍入。在其他方面,我确实从这个例子中学到了很多东西,但舍入是我试图避免的,我需要不舍入的数字。@Branzol。你仍然在取整,只是有一个不同的规则。很抱歉,我没有清楚地看到您将1.67“四舍五入”为1.6,然后是1。如果您已经导入了十进制,为什么必须从十进制导入四舍五入向下进行
呢?谢谢,我将玩一下这个。我想格式化它会产生问题,因为它会变成一个字符串而不是一个浮点?我明白你的意思了——Python的浮点运算有时会创建长字符串。但在这种情况下,无论如何,你都会在选择小数点时遇到问题。健全性检查可以从开始而不是结束时迭代:x=float(str(w)[:4](etc)谢谢!从长远来看,我觉得这将是我的项目的最佳选择!截断(-36.963792534813)为负数生成舍入输出-'-36.9637925349'@Vijender,您需要使用
ceil
而不是
floor
。或者您可以使用
math.trunc
使其适用于这两种情况
timeit.timeit(stmt = "math.floor(math.pi * 10 ** 10) / 10 ** 10", setup = "import math", number = 1000000)