 			var nonWrapperColumn:IAttributeColumn = column;
 			while (nonWrapperColumn is IColumnWrapper)
 				nonWrapperColumn = (nonWrapperColumn as IColumnWrapper).internalColumn;
+			
+			var dataType:String = nonWrapperColumn ? ColumnUtils.getDataType(nonWrapperColumn) : null;
+			if (dataType == null)
+			{
+				// hack -- if we find a number, assume dataType is number
+				for each (var key:IQualifiedKey in column.keys)
+				{
+					if (column.getValueFromKey(key) is Number)
+					{
+						dataType = DataTypes.NUMBER;
+						break;
+					}
+				}
+			}
 			
-			var integerValuesOnly:Boolean = nonWrapperColumn && ColumnUtils.getDataType(nonWrapperColumn) != DataTypes.NUMBER;
+			var integerValuesOnly:Boolean = nonWrapperColumn && dataType != DataTypes.NUMBER;
 			var dataMin:Number = WeaveAPI.StatisticsCache.getMin(column);
 			var dataMax:Number = WeaveAPI.StatisticsCache.getMax(column);
 			

	import weave.api.data.IBinningDefinition;
	import weave.api.data.IColumnWrapper;
	import weave.api.data.IPrimitiveColumn;
	import weave.api.newLinkableChild;
	import weave.compiler.StandardLib;
	import weave.core.LinkableNumber;

			var maxInclusive:Boolean;
			
			for (var iBin:int = 0; iBin < numberOfBins.value; iBin++)
			{
				if (integerValuesOnly)
				{
					maxInclusive = true;
