Golfing out the haters
JavaScript (ES6), 47 bytes

Takes input in currying syntax (n)(p), where n is the number of net upvotes and p is the percentage of upvotes. May return false for 0.



n=&gt;p=&gt;(g=u=&gt;u/(u-n/2)*50+.5^p?g(u+1):u)(n&gt;0&amp;&amp;n)


Try it online!

Commented

n =&gt; p =&gt; (          // given n and p
  g = u =&gt;           // g = recursive function taking u = number of upvotes
    u / (u - n / 2)  //   compute u / (total_votes / 2)
    * 50 + .5        //   turn it into a percentage, add 1/2
    ^ p ?            //   XOR it with p, which gives 0 if the integer parts are matching
                     //   if the result is not equal to 0:
      g(u + 1)       //     try again with u + 1
    :                //   else:
      u              //     stop recursion and return u
)(n &gt; 0 &amp;&amp; n)        // initial call to g() with u = max(0, n)


Edge cases

Let Fn(u) = u / (u - n / 2) * 50 + 0.5


If u = 0 and n = 0, then Fn(u) = NaN and Fn(u) XOR p = p. So, we return u = 0 if n = p = 0 (first iteration of the first test case) or continue with the recursion if p != 0 (first iteration of the 7th test case).
If u > 0 and u = n / 2, then Fn(u) = +Infinity and -- again -- Fn(u) XOR p = p. Unless p = 0, we just go on with the next iteration. (This happens in the 9th and 11th test cases.)