Fix 0.9995 from showing up as 1000m instead of 1.0.
$opt{'sum-format'} = sub { sprintf '%.8g', $_[0] };
$opt{'calc-format'} = sub { sprintf '%*.*f', 0, 2, $_[0] };
$opt{'value-format'} = $opt{units} && sub {
$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
my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
sprintf('%3.*f%1s',
$float && ($unit % 3) == ($unit < 0), # tenths
--- /dev/null
+999499 -
+999500 +
+999501 ++
+1000000
+1049999 -
+1050000 +
+
+.000999499999 -
+.0009995 +
+.001
+
+999.49 -
+999.50 +
+1000
+1049 -
+1050 +
+9999
+
+.999 -
+.9994999 -
+.9995 +
+1.0
+1
+1.000001
--- /dev/null
+999k -
+1.0M +
+1.0M ++
+1.0M
+1.0M -
+1.1M +
+
+999μ -
+1.0m +
+1.0m
+
+999 -
+1.0k +
+1.0k
+1.0k -
+1.1k +
+ 10k
+
+999m -
+999m -
+1.0 +
+1.0
+ 1
+1.0