On Wed, Jul 29, 2015 at 11:09 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:

> Hi Jakub,
>
> For me, JSON is one of a data exchange format just like
> serialize/var_export.
> Anyway, we are about to reach an agreement.
>
> On Wed, Jul 29, 2015 at 5:32 PM, Jakub Zelenka <bu...@php.net> wrote:
>
> >
> >
> >>
> >>>
> >>>> Question is "Is this the way it should be?".
> >>>>
> >>>>
> >>> I have already said that using precision ini wasn't the best idea.
> >>> However json_encode is not the same as serialize and we should not ever
> >>> change its output in a bug fixing release. Doing that could cause also
> >>> other issues as this is a BC break. Lets imagine that someone set low
> >>> precision on purpose just to limit precision and save some space
> >>>
> >>
> >> I've been fixed var_export precision issue as a bug.
> >>
> >> [yohgaki@dev php-src]$ git show 3cf2682083fc1c8635b02c4c
> >> commit 3cf2682083fc1c8635b02c4cf77bdf12c5e5da35
> >> Merge: 5c89d5a 4c45e95
> >> Author: Yasuo Ohgaki <yohg...@php.net>
> >> Date:   Tue Oct 29 17:30:58 2013 +0900
> >>
> >>     Merge branch 'PHP-5.5'
> >>
> >>     * PHP-5.5:
> >>       Fixed Bug 64760 var_export() does not use full precision for
> >> floating-point numbers
> >>
> >>
> > Again it's not the same. json_encode is much more used the var_export
> IMHO
> > so the chance that you break someone's code is much bigger. Also it
> doesn't
> > mean that you did the right thing and it's not a precedence for such
> change
> > in json. I guess that there wasn't anyone who would disagree with you at
> > that time.
> >
>
> I agree that JSON is used more than var_export or even serialize.
>
> I guess almost all users do not care much about preciseness of JSON
> numeric.
> I was the one also until I had to deal with float values. Since almost
> nobody cares
> about preciseness, why not make it more precise?
>
> I may ask general list see if there are users who mind this change.
>
>
>
> >
> >> Although I don't strongly insist merging fix to 5.6 branch, I think data
> >> exchange function
> >> that is not trying to be precise is bad thing.
> >>
> >>
> >>> when transferring data . If you change it, then it's screwed up because
> >>> it will use different ini. We don't know what people do in their code
> and
> >>> we should not break it. As I said this is not a bug but we could
> consider
> >>> changing that if the RFC proposing such change passes.
> >>>
> >>
> >> Strong json numeric validator may have problem with the change. However,
> >> JSON RFC states
> >>
> >> 6.  Numbers
> >>  This specification allows implementations to set limits on the range
> >>    and precision of numbers accepted.  Since software that implements
> >>    IEEE 754-2008 binary64 (double precision) numbers [IEEE754] is
> >>    generally available and widely used, good interoperability can be
> >>    achieved by implementations that expect no more precision or range
> >>    than these provide, in the sense that implementations will
> >>    approximate JSON numbers within the expected precision.  A JSON
> >>    number such as 1E400 or 3.141592653589793238462643383279 may indicate
> >>    potential interoperability problems, since it suggests that the
> >>    software that created it expects receiving software to have greater
> >>    capabilities for numeric magnitude and precision than is widely
> >>    available.
> >>
> >>    Note that when such software is used, numbers that are integers and
> >>    are in the range [-(2**53)+1, (2**53)-1] are interoperable in the
> >>    sense that implementations will agree exactly on their numeric
> >>    values.
> >> https://tools.ietf.org/html/rfc7159
> >>
> >> In order PHP to be more compatible, we should use IEEE 754 range or
> >> our other data exchange standard, which is serialize_precision=17.
> >>
> >>
> > We are still compatible. This is recommendation, not requirement. However
> > I have to agree that it will be probably good idea to change default. But
> > just only if agreed in RFC as this is not a bug! Personally I am against
> > changing that to serialize_precision. I'd much prefer introducing new ini
> > (e.g. json_precision) with the same default as serialize_precision. It
> > would give more flexibility and allow changing value just for json.
> >
>
> I agree that it is implementation matter how "JSON number" is treated.
> Since PHP is
> general programming language, I think it's better to make it as generic as
> possible
> by default.
>
> It's perfectly OK for me to have json_precision. I prefer to have it
> indeed!
>
> My position is
> >>  - PHP7.0: We must use serialize_precision for JSON
> >>  - PHP5.6: I strongly suggest to use serialize_precision for JSON
> >>
> >>
> > I'd prefer 7.1 as this is not something that would be so urgent.
> >
>
> I guess your reason to postpone the change is "json_precision".
> This could be done by 7.0 as the resolution requires a trivial change to
> code.
>
> I don't see reasons not to fix this issue for 5.6 if "serialize_precision"
> is used.
>
> As you see we don't agree here. It means that if you want to get it in,
> > please write RFC. You can add the version option as I did it for json
> > numeric to string RFC and you will see if others agree with you that this
> > is a bug.
> >
>
> No problem. I'll start RFC discussion shortly.
>
> BTW, please don't care if this is a bug or not. We have lots of issues to
> be
> resolved. Let's concentrate resolving issues.
>

Instead of continuing to use serialize_precision, which will produce
unnecessarily long outputs for many values, why don't we just switch to
using the 0 mode of zend_dtoa, i.e. to return the shortest output that is
still accurate if interpreted in round-to-nearest. I think this is what
everybody else is using when they convert floating point numbers to
strings. I guess we may not be able to change normal floating point
printing to use this, but this seems like the best mode for anything using
serialize_precision now and everything that should be using it (like JSON,
and queries, etc).

Nikita

Reply via email to