Not a full answer to your question, but don't use double if you can avoid it, or you'll get odd floating point errors, try running this code:
double d1 = 0.31;
double d2 = 0.27;
double sum = d1 + d2;
bool expectedValue = sum == 0.58;
Console.WriteLine("d1:{0} d2:{1} result {2} equals expected {3}", d1, d2, sum, expectedValue);
expectedValue
is false! Certainly not what you'd want when dealing with money, so use decimal instead.
You code is probably not producing a double in a recognised format. It is worth putting a breakpoint on your code and running
Fields!new_cost.Value.ToString()
to see what is being passed into the parse method. Depending on what the value is, it might even be the class name... If you provide us with an error message, that would help.