2014-08-27 43 views
22

在Swift中是否有与Java的BigInteger类相当的功能?我正试图在Swift中进行大于UInt64最大数量的正整数计算。处理这些数字的最佳方法是什么?BigInteger在Swift中相当于?

+1

十进制类型通常用于财务计算,而不只是任意精度。在Java中,您希望BigInteger(正如您的标题所示)不像您的问题主体指示的那样是BigDecimal。可可不包含任何BigInteger类型。 – bames53 2014-08-27 19:26:29

回答

8

您可以使用Cocoa的NSDecimalNumber类。它不是无限的精确度,但它可以表示38位十进制数字的精度,这可能足以满足您的需求。

+0

这是不同的精度'双'? – nhgrif 2016-04-09 18:38:03

+0

float32大约有sd 7,float 64 sd 16,float80 sd34 – 2016-11-18 22:05:50

5

我写了一个库,允许你在Swift中使用大整数。类似于Java的BigInteger。还有操作员过载使工作更方便。 例子:

let a = BigInteger("111111111111111111111111111111111111111111111110000000001")! 
let b = 999_999_999 
let c = a + b // 111111111111111111111111111111111111111111111111000000000 

https://github.com/kirsteins/BigInteger

+1

这对于arm64的iOS也适用吗?还有任何关于如何将这个包含在某个地方列出的iOS项目中的步骤? – 2015-01-13 10:24:42

+1

是的,它适用于arm64。这里有一个关于如何添加框架依赖性的好指南https://github.com/stephencelis/SQLite.swift#installation。您可以使用BigInteger的本指南。 – Kirsteins 2015-01-13 10:51:35

+0

谢谢,我试着按照你建议的步骤操作,但是我添加它后无法在代码中导入它。你可以录制视频或列出截图的步骤? – 2015-01-13 17:12:35

8

我工作,也对BigNumber库,你可以做一些大的运算量。实际上,该库基于GNU Multiple Precision(GMP)库,并且我编写了一个Objective-C/Swift包装器。 目前大整数数学,包括大量的操作符重载,是可能的。 一个代码示例是这样:

var err : NSError? 
var bi1 = BigInt(nr: 12468642135797531) 
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err) 
var res = bi1 * bi2 
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())") 

导致:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520 

你可以找到在图书馆:https://github.com/githotto/osxgmp

+0

它可以在应用程序中用于提交到Appstore吗?我想这是不能由于许可限制。 – Kirsteins 2015-01-12 11:17:44

+0

我不是GNU和AppStore许可证/限制的专家,但恕我直言,只要你保持包含的引用完好无损,这样原作者就可以被识别出来,这应该不成问题。顺便说一句,我很高兴听到图书馆对你有用!也许你可以与我们分享它的用途是什么?! – 2015-01-13 22:02:07

5

我已经写了迅速的一个大整数和大双的实施,这不需要任何额外的库。只需将其复制到您的项目中。它支持大多数常用数学运算符(如加法,减法,乘法,取幂,模数和除法)的整数(BInt)和分数(BDouble)。一些优化的数学函数,如阶乘或gcd也被实现。

下面是一些代码示例:

// Create a new number: 
let num = BInt(232) 
print(num) // prints "232" 

// You can also use Strings to create a number: 
let veryBig = BInt("-827846184963421874362418746238453267452971345218746328715380000000000") 

// Every standard math operator works well, even with normal Integers 
// Visit the github page for more informations 
let v0 = (BInt(5) + BInt(4)) - BInt(3) 
let v1 = veryBig * 1000 
let v2 = vergBig^num 
let v3 = (veryBig^50000)/(BInt(2)^900) + 1 
let v4 = gcd(abs(veryBig), num) 

// BDouble is very similar, you can find a detailed description on Github 
let fraction = BDouble("27", over: "31") 
print(fraction) // prints "27/31" 

您可以自由使用它没有给我的信用,如果你想请贡献。

你可以在这里找到:https://github.com/mkrd/Swift-Big-Integer

+0

干得好!谢谢。 – 2017-07-04 13:19:16

+0

它可以将Data(NSData)转换为BigInt吗? – 2017-10-04 08:41:38

4

这。

https://github.com/dankogai/swift-pons

其实BigInt有只是它的一部分。除了BIGINT你:

  • 通用理性是需要形成INT8为bigint的分子和分母
  • 一般复杂,或者取整数(高斯整数)或实数类型不仅double和float,但也合理。
  • 纯粹快捷。不仅运行在OS X,iOS和tvOS上,还运行在Linux上。在游乐场愉快地工作。

但最重要的是,它是协议为本这样可以延长,比如全整数

import PONS 

func fib<T:POInteger>(n:T)->T { // with a little better algorithm 
    if n < T(2) { return n } 
    var (a, b) = (T(0), T(1)) 
    for _ in 2...n { 
     (a, b) = (b, a+b) 
    } 
    return b 
} 

let F11 = fib(11 as Int8) 
let F13 = fib(13 as UInt8) 
let F23 = fib(23 as Int16) 
let F24 = fib(24 as UInt16) 
let F46 = fib(46 as Int32) 
let F47 = fib(47 as UInt32) 
let F92 = fib(92 as Int64) 
let F93 = fib(93 as UInt64) 
let F666 = fib(666 as BigInt) 

丹数发生器

+0

它可以将Data(NSData)转换为BigInt吗? – 2017-10-04 08:35:13

3

我发现了一个原型BigInt有在官方斯威夫特repository:​​

您可能可以将其复制到您的项目中并使用它。也许有一天它会被添加到标准库中。