The format specifier %8.6f says place the number in an 8 char wide space and include 6 digits of decimals. One of the two extra spaces is occupied by the decimal point; the last is used for the integer part of the value. Which in this case will be restricted to a single digit before the field width will be overridden.
A specifier of %6.6f doesn;t make much sense because it leaves no room for the decimal point or integer part of the number.
For the most flexible representation, use %12.6g (or larger) which will make a reasonable fist of displaying a fairly wide range of values in a semi consistant fashion:
[0] Perl> printf "%12.6g\n", $_ for map{ "1.23456e$_" } -12 .. +12;; 1.23456e-012 1.23456e-011 1.23456e-010 1.23456e-009 1.23456e-008 1.23456e-007 1.23456e-006 1.23456e-005 0.000123456 0.00123456 0.0123456 0.123456 1.23456 12.3456 123.456 1234.56 12345.6 123456 1.23456e+006 1.23456e+007 1.23456e+008 1.23456e+009 1.23456e+010 1.23456e+011 1.23456e+012
The floating point formatting by sprintf has always -- going way back to the earliest of C compilers -- left a lot to be desired.
You might also find the threads at Engineering FP notation & sprintf and Display floating point numbers in compact, fixed-width format of interest.
In reply to Re: printf exact field width of floating point number
by BrowserUk
in thread printf exact field width of floating point number
by flipper
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |