I was today years old when I learned that the way I learned to round in school was not how everyone rounded. I was taught that the value 1.65, when rounded to one decimal point, would result in 1.7.
Today I was manually calculating gross wages and payroll liabilities to automate a billing process at work. I noticed that several of the calculations were off by a penny and I could not figure out what was causing the issue. That is when I started to look into R’s round()
function I was using.
Below is the issue I found in when scouring for penny rounding errors.

A quick google search was pretty enlightening. I had no idea there were different rounding standards.
Apparently, the way I learned to round only applies to commerce and money. That’s when I read about the international standard (ISO 60559) that deals “… formats and methods for floating-point arithmetic in computer systems.”
When looking at the documentation for the round()
function, it states this:
“Note that for rounding off a 5, the IEC 60559 standard (see also ‘IEEE 754’) is expected to be used, ‘go to the even digit’. Therefore
round(0.5)
is0
andround(-1.5)
is-2
. However, this is dependent on OS services and on representation error (since e.g.0.15
is not represented exactly, the rounding rule applies to the represented number and not to the printed number, and soround(0.15, 1)
could be either0.1
or0.2
).”
I’m still not clear on why round(1902.115, 2)
results in the correct rounding of 1092.12
, but when you wrap the round function around a calculation, the result is the incorrect rounding of the value.

Both of the fields in my data frame that are used in the calculation are numeric:
$ ts_pay_rate : num 36 35.9 143.8 499.5 13.9 ...
$ ts_hrs_units : num 80 80 1 1 80 1.75 80 70 1 11 ...
> dat$ts_pay_rate[2173]
[1] 38.0423
> dat$ts_hrs_units[2173]
[1] 50
Conclusion
So rounding with calculations in R when using the round() function can be problematic when the evaluation digit is a 5. When you feed the round function a number, it rounds the values as expected.
My workaround for this issue works for me since I’m exporting the data to an Excel file. Instead of rounding the calculation to two digits, I round it to three, and let Excel do the rounding for me.
It’s not perfect, and I hope that I can find an answer to my question I posed on Reddit, but for now, it works.