use 5.010; say fraction_for_decimal($_) for qw( 0.3456 1.251 -0.1 -0.25 ); sub fraction_for_decimal { my $decimal = shift; my $mult = 10 ** length [ split m{[.]}, $decimal ]->[1]; my ($num, $den) = (int($decimal * $mult), $mult); my $hcf = _hcf($num, $den); $_ /= $hcf for ($num, $den); return "$num/$den"; } # Stolen from Number::Fraction. sub _hcf { my ($x, $y) = @_; ($x, $y) = ($y, $x) if $y > $x; return $x if $x == $y; while ($y) { ($x, $y) = ($y, $x % $y); } return abs($x); # changed this } __END__ 216/625 1251/1000 -1/10 -1/4