shift unit to prevent additional digits after rounding
[barcat.git] / barcat
diff --git a/barcat b/barcat
index ce3f788ec111f137efb183f86ae3a9886cd3b79a..fedb6c9081334a981f796a40d3201ea57f4b7170 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -112,7 +112,12 @@ $opt{input} = (@ARGV && $ARGV[0] =~ m/\A[-0-9]/) ? \@ARGV : undef
 $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