use warnings; use strict; use POSIX; for my $num (0, -0.1, 0.1, 999.99, 1000, -999.99, -1000, 1.234e34, 1.234e-34){ printf "%-10s %-10s\n", $num, asEng ($num); } sub asEng { my ($num) = @_; return '0' if +$num eq '0'; my $sign = ($num < 0) ? '-' : ''; $num = abs $num; my $e = floor( log($num) / log(1000) ); my $mult = 1000**$e; $e *= 3; $num = $num / $mult; return "$sign${num}e$e"; }