$opt{'sum-format'} = sub { sprintf '%.8g', $_[0] };
$opt{'calc-format'} = sub { sprintf '%*.*f', 0, 2, $_[0] };
$opt{'value-format'} = $opt{units} && sub {
- my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
+ my $unit = int(
+ log(abs $_[0] || 1) / log(10)
+ - 3 * ($_[0] < .9995) # shift to smaller unit if below 1
+ - log(.9995) / log(10) # 3 digits rounding up
+ + 1e-15 # float imprecision
+ );
my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
sprintf('%3.*f%1s',
$float && ($unit % 3) == ($unit < 0), # tenths