Reputation: 373
How can I take a float variable, and control how far out the float goes without round()? For example.
w = float(1.678)
I want to take x and make the following variables out of it.
x = 1.67
y = 1.6
z = 1
If I use the respective round methods:
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
It's going to round and alter the numbers to the point where there no use to me. I understand this is the point of round and its working properly. How would I go about getting the information that I need in the x,y,z variables and still be able to use them in other equations in a float format?
Upvotes: 36
Views: 73646
Reputation: 939
Using only math, I believe you can do this:
>>> f = 8.225
>>> f - f % 0.01
8.22
Using strings you can do something like this:
>>> float(str(f)[:4])
8.22
Some more examples of the first one just for fun:
>>> r = lambda f: f - f % 0.01
>>> r(2.368)
2.36
>>> r(2.36888888)
2.36
>>> r(2.323)
2.32
>>> r(2.326)
2.32
Doesn't work with a single decimal, but works with 2 or more:
>>> r = lambda f,p: f - f % p
>>> r(2.356366,0.1)
2.3000000000000003
>>> r(2.356366,0.01)
2.35
>>> r(2.356366,0.001)
2.356
>>> r(2.356366,0.0001)
2.3563
>>> r(2.356366,0.00001)
2.35636
Source: https://www.reddit.com/r/learnpython/comments/4nj5gu/comment/d44bszf/
Upvotes: 1
Reputation: 1
Easiest way to get integer:
series_col.round(2).apply(lambda x: float(str(x).split(".",1)[0]))
Upvotes: -1
Reputation: 19
I think the easiest answer is :
from math import trunc
w = 1.678
x = trunc(w * 100) / 100
y = trunc(w * 10) / 10
z = trunc(w)
Upvotes: 1
Reputation: 116
also this:
>>> f = 1.678
>>> n = 2
>>> int(f * 10 ** n) / 10 ** n
1.67
Upvotes: 0
Reputation: 75
Integers are faster to manipulate than floats/doubles which are faster than strings. In this case, I tried to get time with both approach :
timeit.timeit(stmt = "float(str(math.pi)[:12])", setup = "import math", number = 1000000)
~1.1929605630000424
for :
timeit.timeit(stmt = "math.floor(math.pi * 10 ** 10) / 10 ** 10", setup = "import math", number = 1000000)
~0.3455968870000561
So it's safe to use math.floor rather than string operation on it.
Upvotes: 6
Reputation:
You can do:
def truncate(f, n):
return math.floor(f * 10 ** n) / 10 ** n
testing:
>>> 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]
Upvotes: 55
Reputation: 662
If you just need to control the precision in format
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
If you need to control the precision in floating point arithmetic
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
--edit--
Without "rounding", thus truncating the number
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')
Upvotes: 3
Reputation: 431
A super simple solution is to use strings
x = float (str (w)[:-1])
y = float (str (w)[:-2])
z = float (str (w)[:-3])
Any of the floating point library solutions would require you dodge some rounding, and using floor/powers of 10 to pick out the decimals can get a little hairy by comparison to the above.
Upvotes: 8