On public contribution pages, currency is not set on ajax-loaded payment forms
We can see this in our iATS extension when a contribution page has payment processors available that include ACH/EFT, but not the site default.
It can be fixed by assigning 'currency' in the preprocess function CRM_Contribute_Form_Contribution_Main.
The reason this works is because the page includes the paymentBlock template, which generates in-line javascript that is responsible for the ajax load of the payment form.
It's curious that the symptom does not show up if the page loads a default processor, but I suspect something hackish is going on in that case.