--- Actions.pm	2010-03-07 19:09:20.000000000 +0100
+++ Actions.pm.new	2010-03-08 10:49:21.000000000 +0100
@@ -1924,14 +1924,57 @@
         %r = box $I2
     };
     if $<escale> {
+        $frac := Q:PIR {
+            $P0 = find_lex '$/'
+            $S0 = $P0['frac']
+            $I1 = length $S0
+            $I0 = 0
+            $N4 = 1
+            $N2 = 0
+            $N3 = 0
+          loop:
+            unless $I0 < $I1 goto done
+            $S1 = substr $S0, $I0, 1
+            inc $I0
+            if $S1 == '_' goto loop
+            $N4 *= 10
+            if $S1 == '0' goto loop
+            $N3 = $S1
+            div $N3, $N3, $N4
+            if $N3 < 0 goto done
+            add $N2, $N2, $N3
+            goto loop
+          done:
+            %r = box $N2
+        };
         my $exp := $<escale>[0]<decint>.ast;
-        if $<escale>[0]<sign> eq '-' { $exp := -$exp; }
+        if $<escale>[0]<sign> ne '-' { $exp := -$exp; }
         make PAST::Val.new( 
-            :value(($int * $base + $frac) / $base * 10 ** +$exp ) ,
+            :value((+$int + $frac) / 10 ** +$exp ) ,
             :returns('Num')
         );
     }
     else {
+        my $base := Q:PIR {
+            $P0 = find_lex '$/'
+            $S0 = $P0['frac']
+            $I1 = length $S0
+            $I0 = 0
+            $I2 = 1
+            $I3 = 1
+          loop:
+            unless $I0 < $I1 goto done
+            $S1 = substr $S0, $I0, 1
+            inc $I0
+            if $S1 == '_' goto loop
+            $I3 = $I2
+            $I3 *= 10
+            if $I3 < 0 goto done # overflow
+            $I2 = $I3
+            goto loop
+          done:
+            %r = box $I2
+        };
         make PAST::Op.new(
             :pasttype('callmethod'), :name('new'),
             PAST::Var.new( :name('Rat'), :namespace(''), :scope('package') ),
