2014-04-28 18:00 GMT+02:00 Roy Smith <r...@panix.com>:
> I'm using Python 2.7
>
> I have a bunch of floating point values.  For example, here's a few (printed 
> as reprs):
>
> 38.0
> 41.2586
> 40.75280000000001
> 49.25
> 33.795199999999994
> 36.837199999999996
> 34.1489
> 45.5
>
> Fundamentally, these numbers have between 0 and 4 decimal digits of 
> precision, and I want to be able to intuit how many each has, ignoring the 
> obvious floating point roundoff problems.  Thus, I want to map:
>
> 38.0  ==> 0
> 41.2586 ==> 4
> 40.75280000000001 ==> 4
> 49.25 ==> 2
> 33.795199999999994 ==> 4
> 36.837199999999996 ==> 4
> 34.1489 ==> 4
> 45.5 ==> 1
>
> Is there any clean way to do that?  The best I've come up with so far is to 
> str() them and parse the remaining string to see how many digits it put after 
> the decimal point.
>
> The numbers are given to me as Python floats; I have no control over that.  
> I'm willing to accept that fact that I won't be able to differentiate between 
> float("38.0") and float("38.0000").  Both of those map to 1, which is OK for 
> my purposes.
>
> ---
> Roy Smith
> r...@panix.com
>

Hi,
I doubt, many would consider a string/regex approach very clean here,
but anyway; hopefully the results conform to your specs (as far as I
understood it correctly). Alternatively, the floats can be rounded
before, if e.g.  39.9999999  could be a false positive for 4-digits
precision.

hth,

   vbr

= = = = = = =

>>> for fl in (38.0, 41.2586, 40.75280000000001, 49.25, 33.795199999999994, 
>>> 36.837199999999996, 34.1489, 45.5, 40.0010, 39.00000009, 39.9999999, 
>>> 38.00009, 40.0100, 41.2000, 43.0001):
... print repr(fl), "==>", len(re.match(r"^-?\d+\.([0-9]{0,4})(?<!0)",
str(fl)).group(1))
...
38.0 ==> 0
41.2586 ==> 4
40.75280000000001 ==> 4
49.25 ==> 2
33.795199999999994 ==> 4
36.837199999999996 ==> 4
34.1489 ==> 4
45.5 ==> 1
40.001 ==> 3
39.00000009 ==> 0
39.9999999 ==> 4
38.00009 ==> 0
40.01 ==> 2
41.2 ==> 1
43.0001 ==> 4
>>>
= = = = = = =
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to