I am not a gifted statistician, so I just made a monte carlo simulation to test. This is not too scientific because in reality different jobs have different numbers of people, and a thousand other variables, but anyway, here is the code and results:
from random import random, randint
p_white = .81
n_occupations = 100
n_workforce = 150000000
occupations = [[] for i in xrange(n_occupations)]
for i in xrange(n_workforce):
occupation = randint(0,n_occupations-1)
race = "white" if random() < p_white else "other"
occupations[occupation].append(race)
percentages = map(lambda x:x.count("white")/float(len(x)), occupations)
print sorted(percentages)
[0.8093594044124566, 0.8093716670190719, 0.8093837105400035, 0.8093941116532061, 0.8094080377696309, 0.809459598174709, 0.8094606757892058, 0.8094949877814243, 0.8095051091912103, 0.8095619154480623, 0.8095855138023271, 0.8096009184415862, 0.8096130265928078, 0.8096471477224493, 0.8096569834673563, 0.8096622916149537, 0.8096635533608949, 0.8096712436008832, 0.8096812597976153, 0.8096856369286581, 0.8096963532163073, 0.8097067434989362, 0.809721568598737, 0.8097215751436514, 0.8097328871910747, 0.8097572581628716, 0.809766392402407, 0.8097706403995997, 0.8097853662894858, 0.8097907743218179, 0.8098200848588418, 0.8098433273181519, 0.8098759161986114, 0.8098761662131717, 0.8098826202953597, 0.8098902227694705, 0.8098932712388633, 0.8099027774814941, 0.8099132209630405, 0.8099239110036907, 0.8099288512271164, 0.809935064025657, 0.8099377895998511, 0.8099442967886306, 0.8099576910748759, 0.8099684818490649, 0.8099723061883299, 0.8099772955347885, 0.8099790775887737, 0.8099951683577414, 0.8099964813792994, 0.8100114768250255, 0.8100264485053597, 0.8100326219727435, 0.8100426685467571, 0.8100538851385188, 0.8100624027564277, 0.8100772456940655, 0.8100799987206602, 0.8100878460787697, 0.8101051239951382, 0.8101238836646114, 0.8101259241335592, 0.8101299639808958, 0.8101333990942324, 0.8101444590699302, 0.810176363997584, 0.8101767343321185, 0.8101835910494692, 0.810185024612142, 0.8101881998783053, 0.8102189975744003, 0.8102348016041733, 0.810247294219311, 0.8102501899417512, 0.8102612850637286, 0.8102728907675896, 0.8102876025226937, 0.8102915035431886, 0.8103243498099062, 0.8103428626649917, 0.8103475670573029, 0.8103618541773706, 0.8103623158464366, 0.8103870909678774, 0.8104014543756358, 0.8104238667513951, 0.8104306535452401, 0.8104537503309478, 0.81046437557304, 0.8104696732444567, 0.8104846773483934, 0.8104918990629446, 0.810527481205214, 0.8105324346430826, 0.8105520454920258, 0.8106940187094273, 0.8107141451872244, 0.8107156884282282, 0.8108683817976586]
As we can see by the results, the min and max are around a tenth of a percent off from the expected value. Even if the job distribution is skewed (certain occupations have a larger workforce), if N is sufficiently large, numbers such as +15% should be completely unrealistic.
Please correct me if I have made a grave error that I did not mention (I know that this is very very hand wavy, unscientific).