Hi
I have a weird problem. I am operating on numbers which add up to around 800 000 000. I have a dataset which I need to split into minidatasets with 1000 000 records. The problem is that when I split my dataset, I loose decimal precision, for example:
Befote splitting the sum of my costs was 810268311.8536920
After splitting - 810268311.8401380
Splitted datasets have the total number of records equal to number of records which was in the initial table.
What can I do about that?
Thank you in advance!
Your numbers never had the accuracy. The 8 byte floating point numeric format used by SAS can only hold up to fifteen significant digits accurately. Your numbers have sixteen digits; you will lose precision on the sixteenth and above digits.
Tom
Hmm so what is there to do about that? Can I at least keep the number at 0.01 decimal precision? 810268311.85 - so that I could get this exact number after splitting, I do not need anything more precise. I"ve tried adding round(cost,0.01) to my data step which splits the data but that didn't help.
There is an exhausting treatise on this topic here:
The behavior of SAS is the same as any software that relies on floating point math, defined by an IEEE standard.
There is a newer DECIMALCONV= option that might help. From the doc:
specifies to convert and format decimal values by using the IEEE Standard for Floating-Point Arithmetic 754-2008. Using the STDIEEE argument improves the accuracy and readability of floating-point numbers. In some cases, more significant digits can be displayed in the same field width.
DECIMALCONV= was added in SAS 9.4.
To the extent you can work with integers instead of decimal fractions, the results will improve. If it would be practical, try:
Those totals should be closer.
Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!
Check out this tutorial series to learn how to build your own steps in SAS Studio.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.