Not sure what the exact reason is, seems as if it gets piped into a Float first. I event tried a RokuKC-suggested hack with formatJSON() to no cigar. "Print" does it just fine, why can't the other stringifiers?!
PS. It can get weirder too:
Brightscript Debugger> d = 1.234567890123456789d+40: ? d 1.2345678901235e+40
I noticed that when I wrote my own FormatJson() function before it was implemented in the Roku OS. I was formatting Doubles using Str(), which didn't result in double precision, although I wasn't too surprised because Str() is defined as taking a Float argument, not a Double. However, I'm surprised (not really) that the roDouble implementation of ifToStr does not generate a double precision string representation. Looks like a bug to me.