C# 为什么SharpDevelop会返回此错误:运算符'/';无法应用于类型为';双倍';和';System.Numerics.BigInteger';?

C# 为什么SharpDevelop会返回此错误:运算符'/';无法应用于类型为';双倍';和';System.Numerics.BigInteger';?,c#,biginteger,sharpdevelop,C#,Biginteger,Sharpdevelop,我完全是个新手。我在SharpDevelop上创建了一个C#程序,它使用BigInteger结构 这是: using System; using System.Numerics; using System.Linq; namespace HCC { class Program { public static void Main(string[] args) { BigInteger[] HCC = new[] { Bi

我完全是个新手。我在SharpDevelop上创建了一个C#程序,它使用BigInteger结构

这是:

using System;
using System.Numerics;
using System.Linq;


namespace HCC
{
class Program
{
    public static void Main(string[] args)
    {

        BigInteger[] HCC = new[]
        {
            BigInteger.Parse("2"),
            BigInteger.Parse("4"),
            BigInteger.Parse("6"),
            BigInteger.Parse("12"),
            BigInteger.Parse("24"),
        };

        double S;

        int i;

        S=0;

        for(i=0; i<HCC.Length; i++)
        {
            S=S+1.0/HCC[i];
        }

        Console.Write(""+S);

        Console.ReadKey(true);          

    }
}
}
这是什么意思?这是否意味着我们不能对大整数执行加法、乘法和除法等基本运算


最重要的是:如何解决这个问题?

您很可能根本不想使用
biginger
。相反,
decimal
可能是您要查找的

大概是这样的:

decimal[] HCC = new [] { 2M, 4M, 6M, 12M, 24M };

...

S += 1M / HCC[i];
十进制是以10为基数,而不是以2为基数,因此它将保证十进制精度,而不是二进制精度。它也有一个相当大的范围,所以它应该是足够好的供您使用

哦,如果你有70位数字,你希望它们如何影响一个只需要精确到7位小数的数字?我想你在某个地方漏掉了一点

编辑

你仍然错过了一个关键点——如果你真的在处理越来越多的数字,那么数字超过20的数字无论如何都不会对结果产生影响。级数之和收敛于给定的数字,您可以很容易地逼近前n个有效数字(看看泰勒级数如何使用它来计算sin(x),这只是另一个无限十进制表达式)

现在,如果序列是有限的,并且不一定是增长的,那么最简单的方法就是在求和之前对它进行排序。在
double
中输入数字-不要担心精度损失,这不会影响结果(这需要一点数学分析,但我不知道你的背景是什么,所以如果你自己不能证明这一点,你可能想问一个关于数学SE的问题)。从大到小顺序排列。一个接一个地总结。结果应该精确到15位左右-当您开始将较大的
1/x
相加时,将很快丢失小数点后的数字,但这些都不会影响结果

当然,如果你已经知道了这一点,你可以很容易地证明你不需要首先计算大数字——它们不会影响比自己的数字加上大约1-2更高的小数。如果增长率真的很大(一个非常简单的例子是G(n)=2^n的几何级数),那么精确的行为就更加明显了,但这似乎非常接近您的情况,因为您在同一个级数中处理的是小的和非常大的数。如果这还不够好,您可以尝试对足够接近的数字进行部分求和,以精确相加,例如,
decimal
,然后将这些求和相加-高中代数应该足够好:)


总之,在头脑中(或在纸上)做数学运算会有很大帮助。无限十进制表达式在数学中是很正常的,有很多工具可以使用它们。还有近似、舍入、限制和其他与此相关的东西。

不,这并不意味着,它的意思正是它所说的:你不能将一个
double
除以一个
biginger
。至于如何解决这个问题:你是对一个近似值感兴趣,还是对一个精确的结果感兴趣?如果是前者,您使用
biginger
有什么特殊原因吗?如果是后者,你需要重新思考你的方法。您是否考虑过名称
biginger
已经告诉您该类不支持分数?@hvd:不会有完全精确的结果,因为真正的结果有一个无限的十进制表达式。但我想要一个真正准确的结果,是的。我在寻找至少7个精确数字。我使用BigInteger是因为我用来执行计算的整数非常大(有些超过70位)。可能会有一个完全精确的结果,可以用分数表示。但是,如果7位数足够,那么我会对所有内容使用
double
(精度约为15位数):这70位整数中的最后一位不会产生任何明显的差异。@hvd好吧,当您反转(
1/x
)时,70位数字中的任何一位都不重要它:D@Luaan当然会:
1/1E70
1/2E70
当除法执行为
double
时,显然会给出不同的结果。我相信在这里使用“decimal”类型是没有用的。“双”型更好。最终的真实结果将无法在任何基中表示为有限表达式。@user50746好吧,请尝试进行数学运算。如果你只关心小数点后7位的精度,那么加一个70位倒过来的数字有什么意义呢?无论如何,这都不会有任何区别(假设HCC一直在增长)。这并不是关于有限的数据类型,它已经在数学水平上失败了:D
decimal[] HCC = new [] { 2M, 4M, 6M, 12M, 24M };

...

S += 1M / HCC[i];