diff --git a/commerce.module b/commerce.module
index 98a6ad4..20a934f 100644
--- a/commerce.module
+++ b/commerce.module
@@ -6,6 +6,13 @@
  */
 
 
+// Define our own rounding constants since we can't depend on PHP 5.3.
+define('COMMERCE_ROUND_NONE', 0);
+define('COMMERCE_ROUND_HALF_UP', 1);
+define('COMMERCE_ROUND_HALF_DOWN', 2);
+define('COMMERCE_ROUND_HALF_EVEN', 3);
+define('COMMERCE_ROUND_HALF_ODD', 4);
+
 /**
  * Implements hook_permission().
  */
@@ -662,6 +669,104 @@ function commerce_numeric_comparison_operator_options_list() {
 }
 
 /**
+ * Returns an options list of round modes.
+ */
+function commerce_round_mode_options_list() {
+  return array(
+    COMMERCE_ROUND_NONE => t('Do not round at all'),
+    COMMERCE_ROUND_HALF_UP => t('Round the half up'),
+    COMMERCE_ROUND_HALF_DOWN => t('Round the half down'),
+    COMMERCE_ROUND_HALF_EVEN => t('Round the half to the nearest even number'),
+    COMMERCE_ROUND_HALF_ODD => t('Round the half to the nearest odd number'),
+  );
+}
+
+/**
+ * Rounds a number using the specified rounding mode.
+ *
+ * @param $round_mode
+ *   The round mode specifying which direction to round the number.
+ * @param $number
+ *   The number to round.
+ *
+ * @return
+ *   The number rounded based on the specified mode.
+ *
+ * @see commerce_round_mode_options_list()
+ */
+function commerce_round($round_mode, $number) {
+  // Remember if this is a negative or positive number and make it positive.
+  $negative = $number < 0;
+  $number = abs($number);
+
+  // Store the decimal value of the number.
+  $decimal = $number - floor($number);
+
+  // No need to round if there is no decimal value.
+  if ($decimal == 0) {
+    return $negative ? -$number : $number;
+  }
+
+  // Round it now according to the specified round mode.
+  switch ($round_mode) {
+    // PHP's round() function defaults to rounding the half up.
+    case COMMERCE_ROUND_HALF_UP:
+      $number = round($number);
+      break;
+
+    // PHP < 5.3.0 does not support rounding the half down, so we compare the
+    // decimal value and use floor() / ceil() directly.
+    case COMMERCE_ROUND_HALF_DOWN:
+      if ($decimal <= .5) {
+        $number = floor($number);
+      }
+      else {
+        $number = ceil($number);
+      }
+      break;
+
+    // PHP < 5.3.0 does not support rounding to the nearest even number, so we
+    // determine it ourselves if the decimal is .5.
+    case COMMERCE_ROUND_HALF_EVEN:
+      if ($decimal == .5) {
+        if (floor($number) % 2 == 0) {
+          $number = floor($number);
+        }
+        else {
+          $number = ceil($number);
+        }
+      }
+      else {
+        $number = round($number);
+      }
+      break;
+
+    // PHP < 5.3.0 does not support rounding to the nearest odd number, so we
+    // determine it ourselves if the decimal is .5.
+    case COMMERCE_ROUND_HALF_ODD:
+      if ($decimal == .5) {
+        if (floor($number) % 2 == 0) {
+          $number = ceil($number);
+        }
+        else {
+          $number = floor($number);
+        }
+      }
+      else {
+        $number = round($number);
+      }
+      break;
+
+    case COMMERCE_ROUND_NONE:
+    default:
+      break;
+  }
+
+  // Return the number preserving the initial negative / positive value.
+  return $negative ? -$number : $number;
+}
+
+/**
  * Generic access control for Drupal Commerce entities.
  *
  * @param $op
diff --git a/modules/line_item/commerce_line_item.rules.inc b/modules/line_item/commerce_line_item.rules.inc
index bce5b81..2114f73 100644
--- a/modules/line_item/commerce_line_item.rules.inc
+++ b/modules/line_item/commerce_line_item.rules.inc
@@ -68,6 +68,13 @@ function commerce_line_item_rules_action_info() {
           'options list' => 'commerce_line_item_price_component_options_list',
           'default value' => 'base_price',
         ),
+        'round_mode' => array(
+          'type' => 'integer',
+          'label' => t('Price rounding mode'),
+          'description' => t('Round the resulting price amount after performing this operation.'),
+          'options list' => 'commerce_round_mode_options_list',
+          'default value' => COMMERCE_ROUND_NONE,
+        ),
       ),
       'group' => t('Commerce Line Item'),
     );
@@ -118,7 +125,7 @@ function commerce_line_item_price_component_options_list() {
 /**
  * Rules action: add an amount to the unit price.
  */
-function commerce_line_item_unit_price_add($line_item, $amount, $component_name) {
+function commerce_line_item_unit_price_add($line_item, $amount, $component_name, $round_mode) {
   if (is_numeric($amount)) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
@@ -126,7 +133,7 @@ function commerce_line_item_unit_price_add($line_item, $amount, $component_name)
     // Calculate the updated amount and create a price array representing the
     // difference between it and the current amount.
     $current_amount = $unit_price['amount'];
-    $updated_amount = $current_amount + $amount;
+    $updated_amount = commerce_round($round_mode, $current_amount + $amount);
 
     $difference = array(
       'amount' => $updated_amount - $current_amount,
@@ -149,7 +156,7 @@ function commerce_line_item_unit_price_add($line_item, $amount, $component_name)
 /**
  * Rules action: subtract an amount from the unit price.
  */
-function commerce_line_item_unit_price_subtract($line_item, $amount, $component_name) {
+function commerce_line_item_unit_price_subtract($line_item, $amount, $component_name, $round_mode) {
   if (is_numeric($amount)) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
@@ -157,7 +164,7 @@ function commerce_line_item_unit_price_subtract($line_item, $amount, $component_
     // Calculate the updated amount and create a price array representing the
     // difference between it and the current amount.
     $current_amount = $unit_price['amount'];
-    $updated_amount = $current_amount - $amount;
+    $updated_amount = commerce_round($round_mode, $current_amount - $amount);
 
     $difference = array(
       'amount' => $updated_amount - $current_amount,
@@ -180,7 +187,7 @@ function commerce_line_item_unit_price_subtract($line_item, $amount, $component_
 /**
  * Rules action: multiply the unit price by some amount.
  */
-function commerce_line_item_unit_price_multiply($line_item, $amount, $component_name) {
+function commerce_line_item_unit_price_multiply($line_item, $amount, $component_name, $round_mode) {
   if (is_numeric($amount)) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
@@ -188,7 +195,7 @@ function commerce_line_item_unit_price_multiply($line_item, $amount, $component_
     // Calculate the updated amount and create a price array representing the
     // difference between it and the current amount.
     $current_amount = $unit_price['amount'];
-    $updated_amount = $current_amount * $amount;
+    $updated_amount = commerce_round($round_mode, $current_amount * $amount);
 
     $difference = array(
       'amount' => $updated_amount - $current_amount,
@@ -211,7 +218,7 @@ function commerce_line_item_unit_price_multiply($line_item, $amount, $component_
 /**
  * Rules action: divide the unit price by some amount.
  */
-function commerce_line_item_unit_price_divide($line_item, $amount, $component_name) {
+function commerce_line_item_unit_price_divide($line_item, $amount, $component_name, $round_mode) {
   if (is_numeric($amount)) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
@@ -219,7 +226,7 @@ function commerce_line_item_unit_price_divide($line_item, $amount, $component_na
     // Calculate the updated amount and create a price array representing the
     // difference between it and the current amount.
     $current_amount = $unit_price['amount'];
-    $updated_amount = $current_amount / $amount;
+    $updated_amount = commerce_round($current_amount / $amount);
 
     $difference = array(
       'amount' => $updated_amount - $current_amount,
@@ -242,7 +249,7 @@ function commerce_line_item_unit_price_divide($line_item, $amount, $component_na
 /**
  * Rules action: set the unit price to a specific amount.
  */
-function commerce_line_item_unit_price_amount($line_item, $amount, $component_name) {
+function commerce_line_item_unit_price_amount($line_item, $amount, $component_name, $round_mode) {
   if (is_numeric($amount)) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
@@ -250,7 +257,7 @@ function commerce_line_item_unit_price_amount($line_item, $amount, $component_na
     // Calculate the updated amount and create a price array representing the
     // difference between it and the current amount.
     $current_amount = $unit_price['amount'];
-    $updated_amount = $amount;
+    $updated_amount = commerce_round($round_mode, $amount);
 
     $difference = array(
       'amount' => $updated_amount - $current_amount,
diff --git a/modules/tax/commerce_tax.module b/modules/tax/commerce_tax.module
index f6ef1c3..dfce1fa 100644
--- a/modules/tax/commerce_tax.module
+++ b/modules/tax/commerce_tax.module
@@ -7,13 +7,6 @@
  */
 
 
-// Define our own rounding constants since we can't depend on PHP 5.3.
-define('COMMERCE_TAX_ROUND_NONE', 0);
-define('COMMERCE_TAX_ROUND_HALF_UP', 1);
-define('COMMERCE_TAX_ROUND_HALF_DOWN', 2);
-define('COMMERCE_TAX_ROUND_HALF_EVEN', 3);
-define('COMMERCE_TAX_ROUND_HALF_ODD', 4);
-
 /**
  * Implements hook_hook_info().
  */
@@ -77,7 +70,7 @@ function commerce_tax_types() {
           'display_title' => $tax_type['title'],
           'description' => '',
           'display_inclusive' => FALSE,
-          'round_mode' => COMMERCE_TAX_ROUND_NONE,
+          'round_mode' => COMMERCE_ROUND_NONE,
           'module' => $module,
         );
 
@@ -339,77 +332,9 @@ function commerce_tax_rate_calculate($tax_rate, $line_item_wrapper) {
  *   The amount rounded based on the type of tax it is for.
  */
 function commerce_tax_rate_round_amount($tax_rate, $amount) {
-  // Remember if this is a negative or positive amount and make it positive.
-  $negative = $amount < 0;
-  $amount = abs($amount);
-
-  // Store the decimal value of the amount.
-  $decimal = $amount - floor($amount);
-
-  // No need to round if there is no decimal value.
-  if ($decimal == 0) {
-    return $negative ? -$amount : $amount;
-  }
-
-  // Round it now according to the tax type's specification.
+  // Round the amount according to the tax type's specification.
   $tax_type = commerce_tax_type_load($tax_rate['type']);
-
-  switch ($tax_type['round_mode']) {
-    // PHP's round() function defaults to rounding the half up.
-    case COMMERCE_TAX_ROUND_HALF_UP:
-      $amount = round($amount);
-      break;
-
-    // PHP < 5.3.0 does not support rounding the half down, so we compare the
-    // decimal value and use floor() / ciel() directly.
-    case COMMERCE_TAX_ROUND_HALF_DOWN:
-      if ($decimal <= .5) {
-        $amount = floor($amount);
-      }
-      else {
-        $amount = ceil($amount);
-      }
-      break;
-
-    // PHP < 5.3.0 does not support rounding to the nearest even number, so we
-    // determine it ourselves if the decimal is .5.
-    case COMMERCE_TAX_ROUND_HALF_EVEN:
-      if ($decimal == .5) {
-        if (floor($amount) % 2 == 0) {
-          $amount = floor($amount);
-        }
-        else {
-          $amount = ceil($amount);
-        }
-      }
-      else {
-        $amount = round($amount);
-      }
-      break;
-
-    // PHP < 5.3.0 does not support rounding to the nearest odd number, so we
-    // determine it ourselves if the decimal is .5.
-    case COMMERCE_TAX_ROUND_HALF_ODD:
-      if ($decimal == .5) {
-        if (floor($amount) % 2 == 0) {
-          $amount = ceil($amount);
-        }
-        else {
-          $amount = floor($amount);
-        }
-      }
-      else {
-        $amount = round($amount);
-      }
-      break;
-
-    case COMMERCE_TAX_ROUND_NONE:
-    default:
-      break;
-  }
-
-  // Return the amount preserving the initial negative / positive value.
-  return $negative ? -$amount : $amount;
+  return commerce_round($tax_type['round_mode'], $amount);
 }
 
 /**
diff --git a/modules/tax/commerce_tax_ui.install b/modules/tax/commerce_tax_ui.install
index 4338682..97317df 100644
--- a/modules/tax/commerce_tax_ui.install
+++ b/modules/tax/commerce_tax_ui.install
@@ -22,7 +22,7 @@ function commerce_tax_ui_install() {
   $tax_type['display_title'] = t('VAT');
   $tax_type['description'] = t('A basic type for taxes that display inclusive with product prices.');
   $tax_type['display_inclusive'] = TRUE;
-  $tax_type['round_mode'] = COMMERCE_TAX_ROUND_HALF_UP;
+  $tax_type['round_mode'] = COMMERCE_ROUND_HALF_UP;
 
   commerce_tax_ui_tax_type_save($tax_type);
 }
@@ -179,7 +179,7 @@ function commerce_tax_ui_update_7000() {
 
   // Update the default VAT tax type to round the half up.
   db_update('commerce_tax_type')
-    ->fields(array('round_mode' => COMMERCE_TAX_ROUND_HALF_UP))
+    ->fields(array('round_mode' => COMMERCE_ROUND_HALF_UP))
     ->condition('name', 'vat')
     ->execute();
 
diff --git a/modules/tax/commerce_tax_ui.module b/modules/tax/commerce_tax_ui.module
index d9e405a..13c1836 100644
--- a/modules/tax/commerce_tax_ui.module
+++ b/modules/tax/commerce_tax_ui.module
@@ -255,7 +255,7 @@ function commerce_tax_ui_tax_type_new() {
     'display_title' => '',
     'description' => '',
     'display_inclusive' => FALSE,
-    'round_mode' => COMMERCE_TAX_ROUND_NONE,
+    'round_mode' => COMMERCE_ROUND_NONE,
     'admin_list' => TRUE,
     'module' => 'commerce_tax_ui',
     'is_new' => TRUE,
diff --git a/modules/tax/includes/commerce_tax_ui.admin.inc b/modules/tax/includes/commerce_tax_ui.admin.inc
index 45edbb9..e98d05b 100644
--- a/modules/tax/includes/commerce_tax_ui.admin.inc
+++ b/modules/tax/includes/commerce_tax_ui.admin.inc
@@ -381,13 +381,7 @@ function commerce_tax_ui_tax_type_form($form, &$form_state, $tax_type) {
     '#type' => 'radios',
     '#title' => t('Tax amount rounding mode'),
     '#description' => t('Specify what type of rounding should occur when tax rates of this type are calculated for the unit price of a line item. Sales taxes will generally not round these amounts at the unit price level, while VAT style taxes will generally round the half up.'),
-    '#options' => array(
-      COMMERCE_TAX_ROUND_NONE => t('Do not round tax amounts'),
-      COMMERCE_TAX_ROUND_HALF_UP => t('Round the half up'),
-      COMMERCE_TAX_ROUND_HALF_DOWN => t('Round the half down'),
-      COMMERCE_TAX_ROUND_HALF_EVEN => t('Round the half to the nearest even number'),
-      COMMERCE_TAX_ROUND_HALF_ODD => t('Round the half to the nearest odd number'),
-    ),
+    '#options' => commerce_round_mode_options_list(),
     '#default_value' => $tax_type['round_mode'],
   );
 
