diff -r 3b8d384cb998 src/org/openbravo/common/actionhandler/ServiceOrderLineRelate.java
--- a/src/org/openbravo/common/actionhandler/ServiceOrderLineRelate.java	Fri Apr 08 14:47:02 2016 +0200
+++ b/src/org/openbravo/common/actionhandler/ServiceOrderLineRelate.java	Mon Apr 11 17:40:54 2016 +0200
@@ -357,8 +357,9 @@
     mainOrderLine.setOrderedQuantity(lineQuantity.multiply(signum));
 
     // Calculate discount
-    BigDecimal discount = listPrice.subtract(servicePrice).multiply(new BigDecimal("100"))
-        .divide(listPrice, currency.getPricePrecision().intValue(), RoundingMode.HALF_UP);
+    BigDecimal discount = listPrice.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : listPrice
+        .subtract(servicePrice).multiply(new BigDecimal("100"))
+        .divide(listPrice, currency.getPricePrecision().intValue(), BigDecimal.ROUND_HALF_EVEN);
     mainOrderLine.setDiscount(discount);
     OBDal.getInstance().save(mainOrderLine);
   }
diff -r 3b8d384cb998 src/org/openbravo/event/ServiceRelationEventHandler.java
--- a/src/org/openbravo/event/ServiceRelationEventHandler.java	Fri Apr 08 14:47:02 2016 +0200
+++ b/src/org/openbravo/event/ServiceRelationEventHandler.java	Mon Apr 11 17:40:54 2016 +0200
@@ -172,7 +172,8 @@
     currentOrderLine.setTaxableAmount(serviceAmount);
 
     // Calculate discount
-    BigDecimal discount = listPrice.subtract(servicePrice).multiply(new BigDecimal("100"))
+    BigDecimal discount = listPrice.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : listPrice
+        .subtract(servicePrice).multiply(new BigDecimal("100"))
         .divide(listPrice, currency.getPricePrecision().intValue(), BigDecimal.ROUND_HALF_EVEN);
     currentOrderLine.setDiscount(discount);
     OBDal.getInstance().save(currentOrderLine);
