double getNiceLower( double ovalue )
	{
		// Add some checks
		double gridFactor	= 1.0;
		double mGridFactor	= 1.0;

		double gridStep		= this.gridStep;
		double mGridStep	= this.labelStep;

		while ( gridStep < 10.0 ) {
			gridStep		*= 10;
			gridFactor		*= 10;
		}

		while ( mGridStep < 10.0 ) {
			mGridStep		*= 10;
			mGridFactor		*= 10;
		}

		int sign			= ( ovalue > 0 ? 1 : -1 );

		long lGridStep		= new Double( gridStep ).longValue();
		long lmGridStep		= new Double( mGridStep ).longValue();

		long lValue			= new Double(sign * ovalue * gridFactor).longValue();
		long lmValue		= new Double(sign * ovalue * mGridFactor).longValue();

		long lMod 			= lValue % lGridStep;
		long lmMod			= lmValue % lmGridStep;

		if ( ovalue < 0 )
		{
			if ( lmMod > ( mGridStep * 0.5 ) )
				return ((double) (sign*lmValue + lmMod - lmGridStep ) / mGridFactor);
			else if ( lMod > 0 )
				return ((double) (sign*lValue + lMod - lGridStep) / gridFactor);
			else
				return ((double) (sign*lValue - lGridStep) / gridFactor);
		}
		else
		{
			if ( lmMod < ( mGridStep * 0.5 ) )
				return ((double) (sign*lmValue - lmMod) / mGridFactor);
			else if ( lMod > 0 )
				return ((double) (sign*lValue - lMod) / gridFactor);
			else
				return ((double) (sign*lValue) / gridFactor);
		}
	}