I wouldn't worry about making that choice yet. The best thing about college is that you can experiment. You can take CS classes while you do your Bio/Chem classes. In fact, that would give you a huge breadth of experience in the fundamentals of a number of fields and could open doors for you to combine the two.
That said, here's my take on life as a programmer:
PROS:
- Cool technology is always being released
- Easy to get a job
- Pays well
- Lots of options (web dev, game dev, embedded, startup, enterprise, contract, consulting, etc)
- Flexibility in your hours, work environment, and time management (it's pretty hard not to get distracted on a computer sometimes)
- You'll wonder how it's possible that people don't know how to make scripts for manual tasks
- Composing lots of different technologies and systems is really fun and rewarding
CONS:
- At a desk a lot of the time (not necessarily alone by yourself as many projects require many people to communicate, but you are inside at a desk)
- Strain on eyes/back
- Makes computers kind of boring sometimes
- Being trapped in legacy code and tools can be brutally painful
- Work can be slow, stressful, and repetitive at times
I've always liked math. Not number crunching; logic problems and the such. I'm not great at them, but I think they are interesting. I didn't really do any coding until my junior year of college where I pretty much fell in love solving little coding puzzles in C. I was able to get involved with web development in grad school and have been doing it ever since.
While math is fundamentally important to programming, you don't need to be able to solve complicated math problems. You don't really need to know any math, but it's very useful to be able to think logically if you start working on big or complex problems. It's important to be able to identify causes of inefficiency and to be able to apply techniques to solve those kinds of problems (I usually just open a text book or google to refresh my brain on things). Those types of issues are pretty rare though. Usually it's just good design skills that you need to understand (e.g. scope, coupling, modularity, message passing). In that sense, an education can be very useful. But it's by no means required, and there are plenty of jobs that don't run into these types of problems on a recurring basis (although, you can expect that kind of stuff if you're working on teams with multi-million line codebases).
So, my recommendation is that you leave your options open for as long as humanly possible