diff --git a/src/main/java/mi/hdm/recipes/NutritionCalculator.java b/src/main/java/mi/hdm/recipes/NutritionCalculator.java index 25e85564b16b13bf5b97df5d07f6949ecb163717..7e7a396dbb1ff319d36b00d7b90aba8ff306bb6f 100644 --- a/src/main/java/mi/hdm/recipes/NutritionCalculator.java +++ b/src/main/java/mi/hdm/recipes/NutritionCalculator.java @@ -23,15 +23,15 @@ public class NutritionCalculator { return NutritionTable.empty(); } - double totalCals = 0, - totalCarbs = 0, - totalFats = 0, - totalProteins = 0, - totalFibers = 0, - totalSalt = 0; + BigDecimal totalCals = BigDecimal.ZERO, + totalCarbs = BigDecimal.ZERO, + totalFats = BigDecimal.ZERO, + totalProteins = BigDecimal.ZERO, + totalFibers = BigDecimal.ZERO, + totalSalt = BigDecimal.ZERO; for (RecipeComponent entry : ingredients.keySet()) { - //TODO: adjust to change in NutritionTable: double -> BigDecimal + final Map<Nutrition, BigDecimal> nutritionTable = entry.getNutritionTable().getTable(); int divisor; @@ -40,15 +40,15 @@ public class NutritionCalculator { } else { divisor = 100; } - totalCals += nutritionTable.get(Nutrition.CALORIES).doubleValue() * ingredients.get(entry) / divisor; - totalCarbs += nutritionTable.get(Nutrition.CARBS).doubleValue() * ingredients.get(entry) / divisor; - totalFats += nutritionTable.get(Nutrition.FAT).doubleValue() * ingredients.get(entry) / divisor; - totalProteins += nutritionTable.get(Nutrition.PROTEINS).doubleValue() * ingredients.get(entry) / divisor; - totalFibers += nutritionTable.get(Nutrition.FIBERS).doubleValue() * ingredients.get(entry) / divisor; - totalSalt += nutritionTable.get(Nutrition.SALT).doubleValue() * ingredients.get(entry) / divisor; + totalCals = totalCals.add(nutritionTable.get(Nutrition.CALORIES).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); + totalCarbs = totalCarbs.add(nutritionTable.get(Nutrition.CARBS).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); + totalFats = totalFats.add(nutritionTable.get(Nutrition.FAT).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); + totalProteins = totalProteins.add(nutritionTable.get(Nutrition.PROTEINS).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); + totalFibers = totalFibers.add(nutritionTable.get(Nutrition.FIBERS).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); + totalSalt = totalSalt.add(nutritionTable.get(Nutrition.SALT).multiply(BigDecimal.valueOf(ingredients.get(entry))).divide(BigDecimal.valueOf(divisor))); } log.info("NutritionTable calculated successfully."); - return new NutritionTable(totalCals, totalCarbs, totalFats, totalProteins, totalFibers, totalSalt); + return new NutritionTable(totalCals.doubleValue(), totalCarbs.doubleValue(), totalFats.doubleValue(), totalProteins.doubleValue(), totalFibers.doubleValue(), totalSalt.doubleValue()); } @@ -63,6 +63,7 @@ public class NutritionCalculator { totalFibers = 0, totalSalt = 0; + //we calculate with double -> still rounding errors! that's why testCalculateNutritionTableFromIngredients failes for (Recipe r : plan.values()) { final Map<Nutrition, BigDecimal> nutritionTable = r.getNutritionTable().getTable(); totalCals += nutritionTable.get(Nutrition.CALORIES).doubleValue();