Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:87356 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 47666 invoked from network); 28 Jul 2015 21:51:51 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 28 Jul 2015 21:51:51 -0000 Authentication-Results: pb1.pair.com header.from=yohgaki@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=yohgaki@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.160.181 as permitted sender) X-PHP-List-Original-Sender: yohgaki@gmail.com X-Host-Fingerprint: 209.85.160.181 mail-yk0-f181.google.com Received: from [209.85.160.181] ([209.85.160.181:32772] helo=mail-yk0-f181.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id F6/64-22108-579F7B55 for ; Tue, 28 Jul 2015 17:51:49 -0400 Received: by ykba194 with SMTP id a194so4837058ykb.0 for ; Tue, 28 Jul 2015 14:51:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=hrbUDKLbpGAviHCkahXraTQ2RzXHgk/qyfZN0YNTdjc=; b=JYGmp3xjZZ0Zk/OKDacqu957Q2Wpt+QOl9JbKLyPbj7brl4fuuiCTXSiGD4C/8d2bn X4Y06GLzeOX7bDFc8BWBZZyOmRtK7QlEPXbwkCH+6567M0qVRtwUPpeqP2L+G3scOh5Q BNHDzAbNo/JmvB99ZVO3UhRw2IKJVcFVeu2pqN7z/4lN7I5+SfY5jeoSmlHzgIxZHfdx dagfPQsCNEDi/DOSwGlH2R/MU5aIcpb8sSUIhDTexKN9fd5HVinA+rFOzSBSH6RLho8C wyfCb7wO2tUdv21sR5RAmsgVvAE/1Q+4AUDrEszYnA58KiLZ6MIeYNKV2Gip1ujVWNSN B1jA== X-Received: by 10.129.103.84 with SMTP id b81mr39856086ywc.55.1438120306664; Tue, 28 Jul 2015 14:51:46 -0700 (PDT) MIME-Version: 1.0 Sender: yohgaki@gmail.com Received: by 10.129.40.77 with HTTP; Tue, 28 Jul 2015 14:51:07 -0700 (PDT) In-Reply-To: References: Date: Wed, 29 Jul 2015 06:51:07 +0900 X-Google-Sender-Auth: 5Xzgg86IYYRQHuObU85Db_u-aic Message-ID: To: Jakub Zelenka Cc: Anthony Ferrara , "internals@lists.php.net" Content-Type: multipart/alternative; boundary=001a11490eb805ec12051bf67a7d Subject: Re: [PHP-DEV] json_decode/encode should return full precision values by default From: yohgaki@ohgaki.net (Yasuo Ohgaki) --001a11490eb805ec12051bf67a7d Content-Type: text/plain; charset=UTF-8 Hi Jakub, On Wed, Jul 29, 2015 at 3:15 AM, Jakub Zelenka wrote: > On Mon, Jul 27, 2015 at 11:17 PM, Yasuo Ohgaki wrote: > >> >> Get JSON data from Google maps and store the data using PHP, then >> users lose last 2 digits of fraction part by default. The value is >> changed >> and wrong. This is definitely a bug. >> >> > I don't really get why you use Google maps as an example. Do you actually > know what's the difference between two distances that differs after > rounding with precision 14? > > I just tried it on > http://www.ig.utexas.edu/outreach/googleearth/latlong.html and set > > Lat 1: 51.602097123457 ; Long 1: -0.120667 > Lat 2: 51.602097123458 ; Long 2: -0.120667 > > The difference is 1.114e-10 km which is 0.0001114 millimetres. Are you > actually serious about that? :) > It's error margin for GPS. How about scientific values? I'm not comfortable with that values aren't processed/stored correctly (as much as possible. You know float can't be exactly precise) Even if GPS values may ignore some fractions, I'm very uncomfortable with ignoring/destroying original values while it could be stored exactly as it is. In addition, it's inconsistent with other data exchange functions. i.e. serialize/var_export. > > > >> We can write >> >> $old = ini_set('precision', 17); >> json_encode($var); >> ini_set('precision', $old); >> > > You can set it once in your ini file if you need such precision. > It's not a good idea. Most PHP codes depend on 14 precision and programmer cannot assure other code works as expected. > > >> >> everywhere to workaround this problem. >> >> 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 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 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. My position is - PHP7.0: We must use serialize_precision for JSON - PHP5.6: I strongly suggest to use serialize_precision for JSON Regards, -- Yasuo Ohgaki yohgaki@ohgaki.net --001a11490eb805ec12051bf67a7d--