MATLAB: Str2double goes wrong for very large numbers

str2double string conversion

Hi I am trying to convert large string IDs to numeric but something goes wrong. The original string is converted but not to the correct number.
What is the correct solution and why is this happening?
>> sprintf('%21.0f',(str2double('1032400774240044774')))
ans =
' 1032400774240044800'

Best Answer

'1032400774240044774' has nineteen digits, which is greater than flintmax: there is no way that this value can be represented using a double and maintain precision down to the ones. This is simply impossible using standard floating point numbers:
If you want to get the full precision then you will need to store it as an integer type, e.g. by converting to uint64 using sscanf:
>> n = sscanf('1032400774240044774','%lu')
n =
1032400774240044774
>> sprintf('%u',n)
ans =
1032400774240044774
Note that you cannot use %f for the sprint format because then it will be internally converted to floating point.
Integer types also have a maximum limit:
>> intmax('uint64')
ans =
18446744073709551615
If you want to store larger numbers than that, then you could use the symbolic toolbox, or store them as strings, or use one of the large integer classes available on FEX, e.g.:
Related Question