df
sempre preenche a saída legível por humanos ( -h
e -H
).
De seu código-fonte no pacote coreutils, lib/human.h
, um enum de opções para a função human_readable
fornecendo arredondamento, conversão de unidades, etc.:
/* Options for human_readable. */
enum
{
/* Unless otherwise specified these options may be ORed together. */
/* The following three options are mutually exclusive. */
/* Round to plus infinity (default). */
human_ceiling = 0,
/* Round to nearest, ties to even. */
human_round_to_nearest = 1,
/* Round to minus infinity. */
human_floor = 2,
...
Observe o comentário: Round to plus infinity (default).
O arredondamento real provavelmente acontece na seguinte função em human.c
, que adiciona true
(ou seja, 1
) se nenhuma outra opção de arredondamento mostrada acima estiver configurada (não é, -h
somente define human_autoscale | human_SI | human_base_1024
, resultando em escalonamento automático usando 1024 como incremento de unidade e imprimindo o sufixo de estilo SI, ou seja, G
) e o valor não é um inteiro:
static long double
adjust_value (int inexact_style, long double value)
{
/* Do not use the floorl or ceill functions, as that would mean
checking for their presence and possibly linking with the
standard math library, which is a porting pain. So leave the
value alone if it is too large to easily round. */
if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX)
{
uintmax_t u = value;
value = u + (inexact_style == human_ceiling && u != value);
}
return value;
}