use Math::Decimal qw(dec_canonise dec_add dec_mul dec_rndiv_and_rem); @check = ( [], [] ); my $fmt = "%-10s %8s %18s %22s\n"; printf $fmt, ; my $subtotal = dec_canonise(0); for $line (@check) { ($item,$price,$quant) = @$line; $dp = dec_canonise($price); $dq = dec_canonise($quant); my $extension = dec_mul($dp,$dq); $subtotal = dec_add($subtotal, $extension); printf $fmt, $item, $price, $quant, rnd($extension); } my $rate = dec_canonise(0.0765); my $tax = dec_mul($subtotal,$rate); my $total = dec_add($subtotal,$tax); printf $fmt, '', '', '', '-----------------'; printf $fmt, '', '', 'Subtotal ', rnd($subtotal); printf $fmt, '', '', 'Tax ', rnd($tax); printf $fmt, '', '', 'Total ', rnd($total); sub rnd { ($q, $r) = dec_rndiv_and_rem("FLR", @_[0], 1); $q . substr((sprintf "%.2f", $r), 1, 3); }