|  | Posted by kkmigas@gmail.com on 12/26/06 15:17 
PHP codeecho "round(10.045,2) - ".round(10.045,2)."<br />";
 echo "round(20.045,2) - ".round(20.045,2)."<br />";
 echo "round(30.045,2) - ".round(30.045,2)."<br />";
 echo "round(40.045,2) - ".round(40.045,2)."<br />";
 
 This is very strange:
 
 round(10.045,2) - 10.04
 round(20.045,2) - 20.05
 round(30.045,2) - 30.05
 round(40.045,2) - 40.05
 
 On Dec 26, 11:57 am, "kkmi...@gmail.com" <kkmi...@gmail.com> wrote:
 > I've tested the same function in the same hardware configuration and
 > the only difference is the OS, so it must be the libraries the big
 > problem is that i don't know witch ones to replace in order to get the
 > system to solve the way i want.
 >
 > On Dec 22, 4:42 pm, "David T. Ashley" <d...@e3ft.com> wrote:
 >
 > > <kkmi...@gmail.com> wrote in messagenews:1166719766.801640.296050@42g2000cwt.googlegroups.com...
 >
 > > > Can some one explain if this can be fixed using php.ini settings ?
 >
 > > > echo "round 20.545 -".round(20.545,2)."<br>";
 > > > echo "round 20.555 -".round(20.555,2)."<br>";
 > > > echo "number_format 20.545 -".number_format(20.545, 2, ',',
 > > > '.')."<br>";
 > > > echo "number_format 20.555 -".number_format(20.555, 2, ',',
 > > > '.')."<br>";
 >
 > > > PHP Version 4.3.0 / FreeBSD
 > > > round 20.545 -20.55
 > > > round 20.555 -20.56
 > > > number_format 20.545 -20,55
 > > > number_format 20.555 -20,55
 >
 > > > PHP Version 4.4.4 /  CENTOS
 > > > round 20.545 -20.55
 > > > round 20.555 -20.55
 > > > number_format 20.545 -20,55
 > > > number_format 20.555 -20,55
 >
 > > > PHP Version 5.1.4 / Windows NT
 > > > round 20.545 -20.55
 > > > round 20.555 -20.56
 > > > number_format 20.545 -20,55
 > > > number_format 20.555 -20,56My only observation about the examples you chose is that the fractional
 > > parts are infinitely repeating "radiximals" in binary.
 >
 > > 0.545 = 545/1000 = 109/200 (irreducible)
 > > 0.555 = 555/1000 = 111/200 (irreducible)
 >
 > > Both of the numbers above can't be expressed as precise binary floating
 > > point numbers because the denominator after reduction has prime factors that
 > > are not "2".
 >
 > > PHP.INI may be a factor, but it may also be that something at a lower level
 > > is occurring (i.e. machine arithmetic, how certain rounding settings on
 > > floating-point processors or libraries are set).
 >
 > > In other words, you've chosen antagonistic examples.
 >
 > > Why don't you try 7/8 (0.875), 15/16 (0.9275), or 31/32 (0.96875) as the
 > > fractional part of the numbers and see if you can get the same behavior.
 > > I'm guessing that you may not.
 >
 > > Any fraction with a reasonable denomiator (< 2^16) that is a power of 2
 > > would be a reasonable test case.
 >
 > > Note that these are all exactly representable by a typical machine.
 >
 > > Just a guess.
  Navigation: [Reply to this message] |