I cite your previous statement, do you still stand by it?
If yes, replace step 3 (which is also step 3 in your detailed example if I understand that correctly) with
for each item {
result=0;
while (abundance>100%) { result=result+1; abundance=abundance-100% }
if ( rnd(abundance)==1 ) { result=result+1 }
// rnd(k) returns 1 with a probability of k, otherwise 0.
This is just the easy to understand pseudocode for single items. This can be easily generalized to stacks of items, so there is no need to do that calculation for every single bullet of a stack of bullets.
Note that this algorithm makes sure that at 100% nothing would change. And at 200% exactly 2 items instead of 1 would drop. And at 150% there still would be the one item guaranteed, but another item would drop with 50% chance.
For a value of 25% abundance each item that would drop at 100% would now have only a 25% chance to drop. Exactly what you would expect from such a setting