There are some settings that could cause this.
Under System -> Configuration -> Taxes -> Calculation, change the "Apply after discount" setting.
Under System -> Configuration -> Sales -> Checkout Totals Sort Order, change them.
Also: do you input the prices excluding tax, and show them including tax (or the other way round?).
Can you confirm that your taxes have been set up as shown in the EU tax guide? GB is still in the EU, you know ;)
http://merch.docs.magento.com/ce/user_guide/Magento_Community_Edition_User_Guide.html#tax/configuration-eu.html
=== UPDATE ===
I am not sure what causes this problem, but maybe one of the following is a solution.
What happens if you change the product price from 2.95 to 2.9520 in the backend?
spConfig
is filled by $this->getJsonConfig()
. If you are not using a 3rd party extension for configurable products, this method can be found in Mage_Catalog_Block_Product_View_Type_Configurable
. You could override this block in a new module and modify the function:
In your new module's config.xml
file, add this section:
<blocks>
<catalog>
<rewrite>
<product_view_type_configurable>Namespace_Modulename_Block_Catalog_Product_View_Type_Configurable</product_view_type_configurable>
</rewrite>
</catalog>
</blocks>
Then create the file Namespace/Modulename/Block/Catalog/Product/View/Type/Configurable.php with these contents:
<?php
class Namespace_Modulename_Block_Catalog_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable {
public function getJsonConfig() {
// rest of method
// this can be found pretty much near the end
$config = array(
'attributes' => $attributes,
'template' => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()),
// basePrice has been changed: added round()
'basePrice' => $this->_registerJsPrice(round($this->_convertPrice($currentProduct->getFinalPrice(), 2))),
'oldPrice' => $this->_registerJsPrice($this->_convertPrice($currentProduct->getPrice())),
'productId' => $currentProduct->getId(),
'chooseText' => Mage::helper('catalog')->__('Choose an Option...'),
'taxConfig' => $taxConfig
);
// rest of method
}
}
It would be even better to use an observer for the event catalog_product_type_configurable_price
which is dispatched in the same method a few lines earlier, but I am not sure about the overall impact for the page if you change the price of the configurable product there.
Another solution would be to override the javascript class Product.Config
and do the rounding manually. A pretty good explanation of how to override JS core classes can be found here:
https://stackoverflow.com/a/11946804/1130898