Как возвращать число в неэкспоненциальной форме C#?
Есть метод создания хеш-функции:
private static double GenerateHash(string number)
{
var s = 0d;
for (var i = 1; i <= 20; i++)
s += Math.Pow(300, 20 - i) * number[i - 1];
s %= 1000000000000000;
return s;
}
number[i - 1] - это ASCII код символа
number всегда длинее 19 символов
До строки s %= 1000000000000000; s выглядит примерно так: 1.234E+40.
Например, при number = 00000000000000000000 до строки s %= 1000000000000000; s = 5.5975134196655518E+48.
Экспоненциальная форма очень сильно округляет число, как сделать так, чтобы число было записано целиком?
Пробовал использовать ulong и long вместо double формата, но по какой-то причине в обоих случаях при первой итерации фора s уходило в минус, а при всех последующих итерациях было равно 0.
Также сделал эквивалент данного кода в питоне и там число выводится полностью.
def get_hash(number):
n = len(number)
s = 0
for i in range(1, n + 1):
s += (300 ** (n - i)) * ord(number[i - 1])
s %= 1000000000000000
return s
Ответы (1 шт):
Я в питоне не шарю, но раз говорят, что
В питоне целые числа неограниченной длины.
То получится как-то так
static void Main(string[] args)
{
long hash = GenerateHash("hello");
Console.WriteLine(hash);
}
private static long GenerateHash(string number)
{
int n = number.Length;
BigInteger s = 0;
for (int i = 1; i <= n; i++)
s += BigInteger.Pow(300, n - i) * number[i - 1];
s %= 1000000000000000;
return (long)s;
}
Вывод в консоль
845136752511