From f2eb219ce27c52c73497841797addbe33863ac63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Fri, 6 May 2011 19:47:28 +0200 Subject: [PATCH] [Bug #1059] Fix bug Fractions can overflow if the numerator and the denominators they carry are big. In that case big decimals are used instead. FEA: ItEr74S04BugFixing --- .../org/zkoss/ganttz/DatesMapperOnInterval.java | 17 +++++++++++++++-- .../java/org/zkoss/ganttz/util/Interval.java | 14 +++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java b/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java index 9d13b00c5..b58866c6a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/DatesMapperOnInterval.java @@ -24,6 +24,9 @@ */ package org.zkoss.ganttz; +import java.math.BigDecimal; +import java.math.RoundingMode; + import org.apache.commons.lang.math.Fraction; import org.joda.time.DateTime; import org.joda.time.Duration; @@ -67,8 +70,18 @@ public class DatesMapperOnInterval implements IDatesMapper { } private int toPixels(Fraction proportion) { - return proportion.multiplyBy(Fraction.getFraction(horizontalSize, 1)) - .intValue(); + try { + return proportion.multiplyBy(Fraction.getFraction(horizontalSize, 1)) + .intValue(); + } catch (ArithmeticException e) { + double d = Math.log10(horizontalSize); + int scale = (int) d + 1; + BigDecimal quotient = new BigDecimal(proportion.getNumerator()) + .divide(new BigDecimal(proportion.getDenominator()), scale, + RoundingMode.HALF_UP); + return quotient.multiply(new BigDecimal(horizontalSize)) + .intValue(); + } } @Override diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/Interval.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/Interval.java index 8702af1f5..68526d270 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/Interval.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/Interval.java @@ -82,9 +82,13 @@ public class Interval { public Fraction getProportion(DateTime date) { Days fromStartToDate = Days.daysBetween(startInclusive, date.toLocalDate()); - Fraction fraction = Fraction.getFraction(fromStartToDate.getDays(), + Fraction result = Fraction.getFraction(fromStartToDate.getDays(), this.daysBetween.getDays()); - return fraction.add(inTheDayIncrement(date)); + try { + return result.add(inTheDayIncrement(date)); + } catch (ArithmeticException e) { + return result; + } } private Fraction inTheDayIncrement(DateTime date) { @@ -92,11 +96,7 @@ public class Interval { Duration duration = new Duration(atStartOfDay, date); double result = ((double) duration.getMillis()) / lengthBetween.getMillis(); - try { - return Fraction.getFraction(result); - } catch (ArithmeticException e) { - return Fraction.ZERO; - } + return Fraction.getFraction(result); } @SuppressWarnings("unchecked")