I don't think so.

ES5 specified the algorithm of  toExponential. “The number is the same” is
not the only requirement.

See the algorithm below: ( please pay attention to 8.a )


   1.

   Let *x* be this Number value <http://es5.github.com/#this-Number-value>.
   2.

   Let *f* be ToInteger <http://es5.github.com/#x9.4>(*fractionDigits*).
   3.

   If *x* is *NaN*, return the String *"NaN"*.
   4.

   Let *s* be the empty String.
   5.

   If *x* *<* 0, then
   1.

      Let *s* be *"-"*.
      2.

      Let *x* = �C*x*.
      6.

   If *x* = +∞, then
   1.

      Return the concatenation of the Strings *s* and *"Infinity"*.
      7.

   If *fractionDigits* is not *undefined* and (*f* < 0 or *f* > 20), throw
   a *RangeError <http://es5.github.com/#x15.11.6.2>* exception.
   8.

   If *x* = 0, then
   1.

      *Let f = 0.*
      2.

      Let *m* be the String consisting of *f*+1 occurrences of the
      character ‘0’.
      3.

      Let *e* = 0.
      9.

   Else, *x* ≠ 0
   1.

      If fractionDigits is not *undefined*, then
      1.

         Let *e* and *n* be integers such that 10*f* ≤ *n* < 10*f*+1 and
         for which the exact mathematical value of *n* × 10*e*�C*f* �C *x* is
         as close to zero as possible. If there are two such sets of *e*
          and *n*, pick the *e* and *n* for which *n* × 10*e*�C*f* is larger.
         2.

      Else, *fractionDigits* is *undefined*
      1.

         Let *e*, *n*, and *f* be integers such that *f* ≥ 0, 10*f* ≤ *n* <
         10*f*+1, the number value for n× 10*e*�C*f* is *x*, and *f* is as
         small as possible. Note that the decimal representation of*n* has *
         f*+1 digits, *n* is not divisible by 10, and the least significant
         digit of *n* is not necessarily uniquely determined by these
         criteria.
         3.

      Let *m* be the String consisting of the digits of the decimal
      representation of *n* (in order, with no leading zeroes).
      10.

   If *f* ≠ 0, then
   1.

      Let *a* be the first character of *m*, and let *b* be the remaining *f
      * characters of *m*.
      2.

      Let *m* be the concatenation of the three Strings *a*, *"."*, and *b*.
      11.

   If *e* = 0, then
   1.

      Let *c* = *"+".*
      2.

      Let *d* = *"0".*
      12.

   Else
   1.

      If *e* > 0, then let *c* = *"+".*
      2.

      Else, *e* ≤ 0
      1.

         Let *c* = *"-"*.
         2.

         Let *e* = �C*e*.
         3.

      Let *d* be the String consisting of the digits of the decimal
      representation of *e* (in order, with no leading zeroes).
      13.

   Let *m* be the concatenation of the four Strings *m*, *"e"*, *c*, and *d*
   .
   14.

   Return the concatenation of the Strings *s* and *m*.

According to this algorithm, (0).toExponential(1) should return "0e+0".(f
is set to 0)

But it looks none of V8, spidermonkey and JScript did that thing. Their
result is "0.0e+0".

So is there anyone could give some message about why does ES5 define this
behavior like this? Or is it simply a spec bug?


2012/3/8 Jens Nockert <j...@nockert.se>

>
> On H.24/03/08, at 12:39, DX Jin <dox....@gmail.com> wrote:
>
> > (0).toExponential(1) should, according to the algorithm in 15.7.4.6,
> return "0e+0".
> >
> > But all browser implementations return "0.0e+0" instead.
> >
> > Which is wrong? The specification or the implementations?
>
> Neither, the result is correct. The number is the same, just different
> representations as strings.
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to