The reason for the 0.5 is a safety measure when using computer numbers. Not all numbers are exact whole numbers (integers) 3 might be 3.0000000001 or 2.9999999999. If you put < 3 then you would get different answers for each of these. In my experience OFP is pretty good at returning integer values ( that is whole numbers only) from count, so in your case I would use < 3, but < 2.5 is not wrong and probably safer.
I know nothing about zombies.
I started this reply with the intention of giving a simple solution to the point macguba mentions that the code will count 1 for each vehicle that has units in it, irrespective of how many units there are inside it. There is a solution - I use it myself, but not with triggers. If you are okay using scripts then:
1. create a trigger that covers the map set to detect East present.
2. in the activation field of the trigger put: [thislist] exec "createEastList.sqs";[] exec "CheckTwoEastLeft.sqs"
createEastList.sqs looks like:
_list = _this select 0
e_loons = []
{{if ((alive _x) and not (_x in e_loons)) then {e_loons = e_loons +[_x]} } forEach crew _x} forEach _list
exit
CheckTwoEastLeft.sqs looks like:
~10
@({alive _x} count e_loons < 2.5)
here put what you want to happen when only 2 east unit are left alive
exit
I have written this from memory so the syntax might need a bit of tweaking
Make the obvious changes if you want it to work for west, resistance or civis