LED forward voltage is a range, so how do you calculate resistor value?
That is a general issue with using a current limiting resistor with LEDs when the supply voltage is close to the forward voltage of the LED. You simply do not have enough overhead for the resistor to be large enough to soak up the diode to diode forward voltage differences.

You also have the issue that the batteries themselves will have a significant range and will likely be more than 3V when new.

Generally, it is better to drive LEDs with a current source rather than a voltage source. However, even then, you need some headroom for the current limiter to work and half a volt is really tight.

There are ways to do it accurately enough under all your constraints, but it gets complicated and has a cost involved and drains the battery faster.







simulate this circuit &ndash; Schematic created using CircuitLab

Pretty amazing after all these years that nobody seems to have put that on a simple little SOIC. 

But, ultimately, unless your requirements are tight on the forward current needed, you are better just to throw in another battery so you have 4.5V nominal and use a larger resistor.