Para el 1: la coma decimal (o punto decimal) también se considera parte del número de dígitos cuando marcas el número mínimo de caracteres a usar. La cadena de control por tanto será
Por cierto, para hacer una división con decimales basta que uno de los dos números sea marcado cómo decimal con un punto decimal. Así:
;
Cuando C encuentra una operación matemática con dos números de diferente naturaleza siempre promociona los de menor rango al mismo tipo del mayor rango de la operación.
Para el 2: el manual dice
For some numeric conversions a radix character ("decimal point") or thousands' grouping character is used. The actual character used depends on the LC_NUMERIC part of the locale. The POSIX locale uses '.' as radix character, and does not have a grouping character. Thus,
printf("%'.2f", 1234567.89);
results in "1234567.89" in the POSIX locale, in "1234567,89" in the nl_NL locale, and in "1.234.567,89" in the da_DK locale.
Como puedes ver te marca que el apostrofe es el signo a usar para que printf imprima el separador de millares y, además, dice que depende de la configuración local.
Otra búsqueda por internet, no muy larga, indica como cambiar el comportamiento de printf si de normal no marca los millares. Para ahorrarte el trabajo te lo pongo aquí. Antes de usar printf debes cambiar la configuración local de esta forma:
setlocale(LC_NUMERIC, "");