diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 13b2cc9676a55c3ddb9af782b2ea3f3100bdaa31..92c70bcd65203a8caff6fa7da64154e35c681d8a 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -621,7 +621,9 @@ static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
     }
 
     V_VT(retv) = VT_R8;
-    V_R8(retv) = (double)(positive?d:-d)*pow(10, exp);
+    if(!positive)
+        d = -d;
+    V_R8(retv) = (exp>0 ? d*pow(10, exp) : d/pow(10, -exp));
     return S_OK;
 }
 
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 3bb2814aadb8468a0c356c9a23187e31d2240495..42e482f28e908149e9bc61b44e7a56094274cffb 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -474,7 +474,7 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
         else exp += e;
     }
 
-    *literal = new_double_literal(ctx, (DOUBLE)d*pow(10, exp));
+    *literal = new_double_literal(ctx, exp>=0 ? d*pow(10, exp) : d/pow(10, -exp));
     return tNumericLiteral;
 }