str2double goes wrong for very large numbers
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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'
0 Kommentare
Akzeptierte Antwort
Stephen23
am 27 Jun. 2018
Bearbeitet: Stephen23
am 27 Jun. 2018
'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.:
1 Kommentar
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Data Type Conversion finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!