First of all, thank you @Zarenor and @ExpHP for your answers 
(Here after I do not use emphasis to shout, but to ease a quick reading.)
I wonder about the purpose of the format! syntax (used in println! and write!):
- is it to be used for (possibly lossy) ASCII serializations?
- is it to be used for user-facing outputs?
- both?
In the case of lossless ASCII serializations, the precision must not be used (not to remove significant digits),
and I tend to think that flags, width, … are useless. The {:g} format would probably be the best (most compact) option.
If the first answer is the right one, I agree with you.
But what is the point of using ‘+’, width, ‘<’, ‘>’, … in non-user-facing outputs?
So, unless I do not understand well, I think that one can revert the argument:
a particular ASCII serialization is probably best serviced by the third party library implementing it and the main purpose of println! is to build user-facing outputs.
(Note e.g. that a JSON document containing integers or floats with a ‘+’ sign is not valid).
In practice, I have the feeling that there is not always a clear separation between ASCII serializations and user-facing outputs.
So the right answer is probably the 3rd one: format! is general purpose.
In my opinion, the first aim of an ASCII serialization is not to be as compact as possible.
And the choice of C creators (as a good compromise between syntax complexity and output compactness) to
use %+03d (or {:+03}) to print the exponent of a float is not a random choice and is a choice which is still valid today.
So, I would like to know if the current choice implemented in Rust comes from a long process or is just an implementation detail.
P.S.: My personal choice would probably go for a more complex format! syntax allowing to choose the format of the exponent.