No there isn't a way to set the scale once and have it apply across multiple operations. So you need explicit calls in your code. That means using the Decimal.setScale method and also the Decimal.divide method in many places. Typically some intermediate calculations will require many decimal places to be preserved but in other places business requirements will require e.g. 2 decimal places and a particular rounding algorithm. So define some constants so at least the values are named in a meaningful way.
A further matter is that if your don't set the scale before storing a value the value can be stored at a larger scale than the value is presented in the UI i.e. the scale you define for a numeric field is applied at presentation time not when a value is stored. This can introduce errors into later calculations or in data exported to other systems. So make sure you explicitly set the scale on values that are persisted.
If you are doing financial calculations typically you do need to be precise about rounding and so will end up with some blocks of code looking like this:
Decimal factor = net.divide(up.Net__c, INTERMEDIATE_SCALE, ROUNDING_MODE);
p.NetBeforeTaxes__c = (up.NetBeforeTaxes__c * factor).setScale(SCALE, ROUNDING_MODE);
p.NetAfterTaxes__c = (up.NetAfterTaxes__c * factor).setScale(SCALE, ROUNDING_MODE);
Its better to think about - and write tests for - rounding up front than be trying to track down 1 cent rounding errors a year later when you are in production.