Я пытаюсь определить количество цифр в числе С# ulong, я пытаюсь сделать это, используя некоторую математическую логику, а не используя ToString(). Length. Я не сравнивал два подхода, но видел другие сообщения об использовании System.Math.Floor(System.Math.Log10 (number)) + 1, чтобы определить количество цифр. Кажется, что он работает нормально, пока я не перейду с 999999999999997 до 999999999999998, и в этот момент я начну получать неверный счет.
Кто-нибудь сталкивался с этой проблемой раньше?
Я видел похожие записи с акцентом Java @Почему log (1000)/log (10) - это не то же самое, что и log10 (1000)?, а также post @Как получить отдельные цифры номера int?, который указывает, как я мог бы достичь того же, используя оператор%, но с гораздо большим количеством кода
Вот код, который я использовал для имитации этого
Action<ulong> displayInfo = number =>
Console.WriteLine("{0,-20} {1,-20} {2,-20} {3,-20} {4,-20}",
number,
number.ToString().Length,
System.Math.Log10(number),
System.Math.Floor(System.Math.Log10(number)),
System.Math.Floor(System.Math.Log10(number)) + 1);
Array.ForEach(new ulong[] {
9U,
99U,
999U,
9999U,
99999U,
999999U,
9999999U,
99999999U,
999999999U,
9999999999U,
99999999999U,
999999999999U,
9999999999999U,
99999999999999U,
999999999999999U,
9999999999999999U,
99999999999999999U,
999999999999999999U,
9999999999999999999U}, displayInfo);
Array.ForEach(new ulong[] {
1U,
19U,
199U,
1999U,
19999U,
199999U,
1999999U,
19999999U,
199999999U,
1999999999U,
19999999999U,
199999999999U,
1999999999999U,
19999999999999U,
199999999999999U,
1999999999999999U,
19999999999999999U,
199999999999999999U,
1999999999999999999U
}, displayInfo);
Заранее спасибо
Пат