You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cf...@apache.org on 2012/10/30 20:33:40 UTC
svn commit: r1403836 -
/incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as
Author: cframpton
Date: Tue Oct 30 19:33:39 2012
New Revision: 1403836
URL: http://svn.apache.org/viewvc?rev=1403836&view=rev
Log:
Fix for floating point errors showing up in NumericStepper. The errors stemmed from adding/subtracting the offset (the minimum value) from the value that's being validated. We avoided float errors in the rounding by scaling, but didn't account for errors when adjusting by the offset. Now, we scale the offset as well to remove these errors. Shouldn't round the offset value if the interval is an integer. Only round when we are scaling the values to remove the unneeded precision. [SDK-31416][SDK-31417]
Modified:
incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as
Modified: incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as
URL: http://svn.apache.org/viewvc/incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as?rev=1403836&r1=1403835&r2=1403836&view=diff
==============================================================================
--- incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as (original)
+++ incubator/flex/sdk/branches/develop/frameworks/projects/spark/src/spark/components/supportClasses/Range.as Tue Oct 30 19:33:39 2012
@@ -451,8 +451,7 @@ public class Range extends SkinnableComp
var maxValue:Number = maximum - minimum;
var scale:Number = 1;
-
- value -= minimum;
+ var offset:Number = minimum; // the offset from 0.
// If interval isn't an integer, there's a possibility that the floating point
// approximation of value or value/interval will be slightly larger or smaller
@@ -463,20 +462,26 @@ public class Range extends SkinnableComp
// we scale by the implicit precision of the interval and then round. For
// example if interval=0.01, then we scale by 100.
- if (interval != Math.round(interval))
- {
+ if (interval != Math.round(interval))
+ {
+ // calculate scale and compute new scaled values.
const parts:Array = (new String(1 + interval)).split(".");
scale = Math.pow(10, parts[1].length);
maxValue *= scale;
- value = Math.round(value * scale);
+ offset *= scale;
interval = Math.round(interval * scale);
- }
-
+ value = Math.round((value * scale) - offset);
+ }
+ else
+ {
+ value -= offset;
+ }
+
var lower:Number = Math.max(0, Math.floor(value / interval) * interval);
var upper:Number = Math.min(maxValue, Math.floor((value + interval) / interval) * interval);
var validValue:Number = ((value - lower) >= ((upper - lower) / 2)) ? upper : lower;
- return (validValue / scale) + minimum;
+ return (validValue + offset) / scale;
}
/**