Re: [PHP-DEV] Proposal: change precision for output functions
On 2019-01-07 21:17, Legale.legale wrote: I think your solution by changing precision is not good enough because float summation is still not working properly. As you may know, most computers use binary numbers. This applies to floating-point values as well. They have a limited number of binary digits. Many base-10 numbers cannot be expressed exactly in base-2 with limited number of digits. When you write 0.1 + 0.7, what you get (with double-precision floats) is closer to 0.155511 + 0.6999555911 = 0.7999333866. This is expected and proper and well known. You have to use formatting functions like number_format if you need neatly rounded base-10 output. There are also a lot of libraries for precise base-10 calculations. They will be a lot slower than native binary floating-point calculations, though. Regards, Lauri Kenttä -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Proposal: change precision for output functions
> 08.01.2019, 00:39, "Legale.legale" : > What proposal? I'm talking about elementary arithmetic. > > Take a look here: > Https://jdoodle.com/embed/v0/Tgu Yes, floating-point arithmetic says: '0.8!=0.1+0.7'. jdoodle.com/a/Thv Will we discuss this now? -- Semen V. Dubina https://sam002.net/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Proposal: change precision for output functions
What proposal? I'm talking about elementary arithmetic. Take a look here: Https://jdoodle.com/embed/v0/Tgu On Jan 7, 2019 10:32 PM, Semen Dubina wrote: > > > > 07.01.2019, 22:17, "Legale.legale" : > > I think your solution by changing precision is not good enough because > > float summation is still not working properly. > > > > > var_dump(0.1 + 0.7); > > > > returns: > > > > 0.79 > > > > expected: 0.8 > > > > Hi! > > If you are about the proposal, then '0.1 + 0.7 !== 0.8'. > Why you expected 0.8? > Check, plz: https://3v4l.org/Ughn2 > > -- Semen V. Dubina https://sam002.net/
Re: [PHP-DEV] Proposal: change precision for output functions
> 07.01.2019, 22:17, "Legale.legale" : > I think your solution by changing precision is not good enough because float > summation is still not working properly. > > var_dump(0.1 + 0.7); > > returns: > > 0.79 > > expected: 0.8 > Hi! If you are about the proposal, then '0.1 + 0.7 !== 0.8'. Why you expected 0.8? Check, plz: https://3v4l.org/Ughn2 -- Semen V. Dubina https://sam002.net/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Proposal: change precision for output functions
I think your solution by changing precision is not good enough because float summation is still not working properly. wrote: > > > 07.01.2019, 20:24, "Thomas Bley" : > > > > Hello, > > > > good point, having: > > > > echo ini_get('precision') . PHP_EOL; > > echo ini_get('serialize_precision') . PHP_EOL; > > echo json_encode(array('price' => round('45.99', 2))) . PHP_EOL; > > echo (0.1+0.7), json_encode(0.1+0.7) . PHP_EOL; > > > > gives (https://3v4l.org/ldgo8): > > > > Output for 7.1.0 - 7.3.0 > > 14 > > -1 > > {"price":45.99} > > 0.80.7999 > > > > Output for 5.3.6 - 5.6.38, 7.0.0 - 7.0.33 > > 14 > > 17 > > {"price":45.99} > > 0.80.8 > > > > what is the preferred way to upgrade from php 5.6 to 7.x in order to get > > the same results? > > > > Regards > > Thomas > > > > Force 'serialize_precision': https://3v4l.org/coaWm > But remember - a float is not suitable for output. You need rounded and > formatted manually. > > P.S. Try with JS: `JSON.stringify(0.1+0.7);` > > -- Semen V. Dubina https://sam002.net/ > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php >
Re: [PHP-DEV] Proposal: change precision for output functions
> 07.01.2019, 20:24, "Thomas Bley" : > > Hello, > > good point, having: > > echo ini_get('precision') . PHP_EOL; > echo ini_get('serialize_precision') . PHP_EOL; > echo json_encode(array('price' => round('45.99', 2))) . PHP_EOL; > echo (0.1+0.7), json_encode(0.1+0.7) . PHP_EOL; > > gives (https://3v4l.org/ldgo8): > > Output for 7.1.0 - 7.3.0 > 14 > -1 > {"price":45.99} > 0.80.7999 > > Output for 5.3.6 - 5.6.38, 7.0.0 - 7.0.33 > 14 > 17 > {"price":45.99} > 0.80.8 > > what is the preferred way to upgrade from php 5.6 to 7.x in order to get the > same results? > > Regards > Thomas > Force 'serialize_precision': https://3v4l.org/coaWm But remember - a float is not suitable for output. You need rounded and formatted manually. P.S. Try with JS: `JSON.stringify(0.1+0.7);` -- Semen V. Dubina https://sam002.net/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Proposal: change precision for output functions
Semen Dubina wrote on 07.01.2019 16:38: > Hi, everyone! > Original PR and description see: https://github.com/php/php-src/pull/3460. > > Because of the accuracy constraint set by the 'precision' variable, debugging > problems often occur, and many developers consider the limited accuracy to be > a > feature of the language. > For better compatibility with other languages and predictable behavior, I > suggest changing the default value of the variable 'precision' to -1. > In the tracker you can find several bugs in which people trusted output of > 'var_dump' and 'echo': > https://bugs.php.net/bug.php?id=66866 > https://bugs.php.net/bug.php?id=66959 > https://bugs.php.net/bug.php?id=68551 > https://bugs.php.net/bug.php?id=73358 > > Examples: https://3v4l.org/Mr4KM > > If you know a case when it will violate some task, describe it, please. I > think > that the trusting of FLOAT is a very bad practice. > > -- Semen V. Dubina https://sam002.net/ > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > Hello, good point, having: echo ini_get('precision') . PHP_EOL; echo ini_get('serialize_precision') . PHP_EOL; echo json_encode(array('price' => round('45.99', 2))) . PHP_EOL; echo (0.1+0.7), json_encode(0.1+0.7) . PHP_EOL; gives (https://3v4l.org/ldgo8): Output for 7.1.0 - 7.3.0 14 -1 {"price":45.99} 0.80.7999 Output for 5.3.6 - 5.6.38, 7.0.0 - 7.0.33 14 17 {"price":45.99} 0.80.8 what is the preferred way to upgrade from php 5.6 to 7.x in order to get the same results? Regards Thomas -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php