For this week’s T-SQL Tuesday, Brent Ozar (b|t) asked us to share either our most or least favorite SQL Server data type. I can’t confess to having any particularly strong feelings on the subject in either direction even if you take into account my keenness to add the number 2 on the end every time I see a datetime.
I do however struggle to resist the opportunity to use a catchy title and this week’s subject was enough to finally give me the motivation to put the furloughed part of my current four day working week to good use and set up a blog.
The float data type can often look like a tempting, easy choice for numerical data types. Why worry about all that precision and scale nonsense when you can just use a data type that will hold literally* any number!
*do not take this claim literally
Let’s test this out by counting problems. We’ll start in a relaxed state and steadily increase the pressure level until we reach 99 problems (one metric Jay-Z).
DECLARE @Problems float(24) = 0.0; While NOT(@Problems > 99) BEGIN SET @Problems += 0.1 END; Print 'I''ve got ' + CAST(@Problems as varchar(10)) + ' problems but floating point precision ''aint one';
Unfortunately we end up a little way over 99 at 99.0991 (henceforth known as an imperial Jay-Z).
Why? Because accuracy isn’t the main aim of a float, it’s a way of storing something that’s roughly the right number in a small space, in a way computers find easy to process quickly, there are values that it can get really close to but never accurately store. That’s great if you’re not that worried about precision (imagine streams of IOT readings with an inherent error to them), it’s less good if you want the exact right number (think applying interest rates to your savings).
You might also be caught out by code like this:
DECLARE @Problems float(24) = 0.0; While @Problems <> 99 BEGIN SET @Problems += 0.1; PRINT 'I''ve got ' + CAST(@Problems as varchar(10)) + ' problems but floating point precision ''aint one'; END;
It looks innocent enough but because we never actually hit a value of 99 on the nose the loop never ends, unless you want unending loops running on your server then that’s a Bad Thing™
Is using a floating point data type the end of the world? Probably not, most likely you’ll just sooner or later waste a few hours working out why the percentages on a report don’t total to 100.
Probably the biggest benefit I get as a senior developer from the float datatype is code smell. It’s a nice clear flag that that code possibly hasn’t been thought through as carefully as it should and I probably want to take a closer look.
Thanks for reading and do come back in the future, I’m planning on starting up a series over the next few weeks on another data type I’ve been spending a lot of time with lately at work – XML.
- Bert Wagner talks about how to recreate floating point maths in SQL.
- Check out SQL Server’s data type precedencies to see where you might get an implicit conversion to a float.
- Phil Factor gives his take on floating point numbers in SQL Server.
- Hugo Kornelis provides a great counter point in his post discussing when float is the best choice to use T-SQL Tuesday #136 – Float does NOT suck!
One thought on “I’ve Got 99.0991 Problems But Floating Point Precision ‘Aint One”