2014-04-28 18:00 GMT+02:00 Roy Smith <[email protected]>:
> 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
> [email protected]
>
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