On Mon, Jul 14, 2008 at 9:00 PM, Christopher Barker
<[EMAIL PROTECTED]> wrote:
> Eric Lemoine wrote:
>> Yes, repr. It was in the provided code snippet. Thanks. Eric
>
> yes, indeed it was. sorry about that.
>
> I think that's a mistake. Python's repr() is designed to satisfy:
>
> eval(repr(object)) == object
>
> that can't always be done, but that's the theory -- it's a good way to
> convert python objects into python code, but in this case, we're turning
> python objects into JavaScript code.
>
> In the case of floats, repr() returns a litteral that has enough digits
> to guarantee the above. So, for instance, when you have start with a
> value that can't be exactly represented as a float, you get a lot of digits:
>
>  >>> f = 0.1
>  >>> repr(f)
> '0.10000000000000001'
>
> If there is an exact mapping from binary to decimal, you get a cleaner
> result:
>
>  >>> f = 0.128
>  >>> repr(f)
> '0.128'
>
> Anyway, I doubt that what you really want in JSON is that full number of
> digits.
>
> Options:
>
> (1) Use str() instead. It gives a "clean" result, apparently truncating
> to 12 significant figures. As a python float can hold up to 14 decimal
> figures, that's pretty good.
>
> (2) Use string formatting, with the %g formatter. This lets you specify
> the number of significant figures you want to display:
>
> def FLOAT_REPR(f, Precision=8):
>      format_str = "%%.%ig"%Precision
>      return format_str%f
>
> I don't know if the geoJSON API has a place to specify precision of
> numbers, but it might be nice.
>
>
> Either of these would work for floats and decimals (and integers, and
> numpy types, I think)

Thanks for these explanations Christopher, they are very useful to me.

Regarding the usage of repr() for the encoding of floats in
simplejson: what's weird is that before 1.8 str() was used.

Cheers,
--
Eric
_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to