Временное решение C # для значения, слишком большого для десятичного числа - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть функция, которая очень хорошо работает для не слишком больших значений:

    public BigInteger GetFrom(decimal value)
    {
        var decimalPlaces = 20;
        var factor = (decimal) Math.Pow(10, decimalPlaces);
        return new BigInteger(value * factor);
    }

Правильно преобразуется:

123m           = 12300000000000000000000
123.123456789m = 12312345678900000000000
0.123m       = 12300000000000000000
0.123456789m = 12345678900000000000
0.123456789012345678902345678901234567890m = 12345678901234567890
1.123456789012345678902345678901234567890m = 112345678901234567890

Но выводит что-то вроде: 12345678901234567890.12345678901234567890m.Конечно, потому что 12345678901234567890.12345678901234567890m * Math.Pow (10, 20) слишком велика для десятичной дроби, но мне не нужно это как десятичная дробь, мне нужно это как BigInteger, как примеры до

12345678901234567890.12345678901234567890m = 1234567890123456789012345678901234567890

Buy,Я не уверен, что / как лучше всего решить эту проблему ...

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ну, в основном следуя предложению jdweng:

    public BigInteger GetFrom(decimal value)
    {
        DecimalPlaces = 20;
        string strValue = HasDecimalPlaces(value) ? ConvertAValueWithDecimalPlaces(value) : ConvertARoundedValue(value);
        return BigInteger.Parse(strValue);
    }

    private static bool HasDecimalPlaces(decimal value)
    {
        return ! Math.Round(value).Equals(value) || value.ToString(CultureInfo.InvariantCulture).Contains(".");
    }

    private string ConvertAValueWithDecimalPlaces(decimal value)
    {
        var commaLeftRight = value.ToString(CultureInfo.InvariantCulture).Split('.');
        return commaLeftRight[0] + commaLeftRight[1].PadRight(DecimalPlaces, '0').Substring(0, DecimalPlaces);
    }

    private string ConvertARoundedValue(decimal value)
    {
        return value.ToString(CultureInfo.InvariantCulture) + new string('0', DecimalPlaces);
    }
0 голосов
/ 06 февраля 2019
...