Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对于十进制数太大的值的解决方法_C#_Decimal_Biginteger - Fatal编程技术网

C#对于十进制数太大的值的解决方法

C#对于十进制数太大的值的解决方法,c#,decimal,biginteger,C#,Decimal,Biginteger,我有一个函数,它在值不太大的情况下工作得很好: public BigInteger GetFrom(decimal value) { var decimalPlaces = 20; var factor = (decimal) Math.Pow(10, decimalPlaces); return new BigInteger(value * factor); } 它可以正确地转换: 123m = 12

我有一个函数,它在值不太大的情况下工作得很好:

    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
但trows的值类似于:123456789001234567890.123456789001234567890m。 当然,因为123456789012134567890.123456789012134567890M*Math.Pow(10,20)对于小数来说太大了,但是我不需要这个作为小数,我需要这个作为大整数,就像前面的例子一样

12345678901234567890.12345678901234567890m = 1234567890123456789012345678901234567890

购买,我不确定解决这个问题的最佳方法是什么…

您可能应该实施一个利用大小数的解决方案


好吧,基本上遵循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);
    }

就像使用一样?据我所知,如果我使用这个,我会丢失小数点,我不想要它。问题不在于“pow”方法,这里的错误是BigInteger(值*因子);BigInteger构造函数上的操作将小数点移动到20位以上并使用BitInteger。完成计算后,将小数点移回原位。就像20000000和20M一样。@jdweng有点像MoveDecimalPlaceTo?你输入了什么?字符串还是数字?