【问题标题】:Big numbers with fraction support支持分数的大数字
【发布时间】:2020-06-03 14:12:58
【问题描述】:

我需要一个可以处理非常大的数字但也支持分数的 c# 数字,我查看了 .NET 4.0 中的 System.Numerics.BigInteger 但我无法让它与分数一起使用。

something i = 2;
something j = 5;
something k = i/j; //should be 0.4

当我尝试时

 BigInteger i = 2;
 BigInteger j = 5;
 double d = (double)(i/j); //d is 0.0

有人知道这样的图书馆吗?

【问题讨论】:

  • 您只是将整数除法结果(已经是整数)转换为双精度数。

标签: c# numeric


【解决方案1】:

F# PowerPack 包含一个数字类型BigRational。它是在 F# 中实现并为 F# 设计的,但该类型也应该完全可以在 C# 中使用(包括重载运算符和类似的东西)。 PowerPack 是一个具有额外 F# 功能的附加库,因此它不是 .NET 框架的一部分,但它是 Microsoft 支持的产品。

BigRational 类型支持所有基本运算符 (+, /, -, *, >, <, >=, <=, ==, !=),我相信它会自动保持数字的正常形式。如果您将数字表示为两个 BigInteger 值,则必须实现比较,使 1/2 等于 2/4

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我曾经使用过这个库: W3b.Sine。它是:

      任意精度的十进制数 用 C# 开发的库。

      你也可以试试http://www.fractal-landscapes.co.uk/bigint.html。但是,我没有使用它的经验。

      【讨论】:

      • 很遗憾,此来源已不存在。
      【解决方案4】:

      考虑Decimal 类是否足够大:

      Decimal 值类型表示 十进制数,范围从正数 79,228,162,514,264,337,593,543,950,335 为负 79,228,162,514,264,337,593,543,950,335。 十进制值类型是合适的 对于需要的财务计算 大量显着积分 和小数位数,没有四舍五入 错误。

      如果你想变得更大,那么寻找一个“bignum”库,例如GMP(和谷歌搜索bindings)。

      【讨论】:

        【解决方案5】:

        这应该很好地将两个 BigInteger 的有理数转换为双精度数:

        struct BigRational
        {
            BigInteger numerator;
            BigInteger denominator;
        
            public double ToDouble()
            {
                BigInteger quotient;
                BigInteger remainder;
        
                quotient = BigInteger.DivRem(numerator, denominator, out remainder);
        
                return (double)quotient + (double)remainder / (double)denominator;
            }
        }
        

        【讨论】:

        • 不错,现在只需扩展它以支持所有其他操作。
        • 是的,来吧,你还在等什么?您的免费样品太简短了 ;-)
        【解决方案6】:

        一个基于 BigInteger 的实验性BigRational in BCL Codeplex

        【讨论】:

          【解决方案7】:

          BigInteger 只支持它在 tin 上所说的内容 - 整数,而分数则不支持。

          double 数据类型支持从 ±5.0 × 10−324 到 ±1.7 × 10308 的二进制浮点数,decimal 支持十进制浮点数点数从 ±1.0 × 10−28 到 ±7.9 × 1028。 Gabe 的回答提到了可用于对分数进行建模的类,但如果范围足够,请坚持使用原始数据类型。

          【讨论】:

            【解决方案8】:

            您的“非常大的数字”的范围是多少?

            System.Double.MaxValue = 1.7976931348623157E+308,不过对我来说这似乎是一个相当大的数字(MSDN Double.MaxValue

            【讨论】:

            • 但是 Doubles 的动态范围很宽,但精度并不高——只有 15-17 个有效数字。这是一个真正的问题,因为舍入误差可以并且确实会蔓延到计算中。十进制缺少动态范围。理想情况下,需要有一个 128 位的 SuperType,更高,并且与 double 相同或更大的指数范围。
            【解决方案9】:

            i/j 有什么意义吗?它们是类的实例,您需要使用 BigInteger.Divide(i, j)

            虽然它设计用于处理整数,但我应该想象它会丢弃任何余数。如果它确实支持没有函数调用的直接除法,那么这就是你得到 0 的原因。

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-14
            • 2012-10-19
            • 1970-01-01
            • 2019-12-12
            • 1970-01-01
            • 2012-05-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多