F# Powerpack 中的 BigRational 定义如下:
[<CustomEquality; CustomComparison>]
[<StructuredFormatDisplay("{StructuredDisplayString}N")>]
type BigRational =
| Z of BigInteger
| Q of BigRationalLarge
其中 aBigRationalLarge
定义为:
[<CustomEquality; CustomComparison>]
type BigRationalLarge =
| Q of BigInteger * BigInteger
BigInt
要以 1000 精度打印 a ,请执行以下操作:
let factorial n = Seq.fold ( * ) 1I [1I .. n]
printf "Factorial of 1000 is %A" (factorial 1000I)
取自这里。
看看这里BigRationalLarge
的类型:
有多种方法可以将其转换为不同的打印类型:
static member ToDouble(n:BigRational) =
match n with
| Z z -> ToDoubleI z
| Q q -> BigRationalLarge.ToDouble q
static member ToBigInt(n:BigRational) =
match n with
| Z z -> z
| Q q -> BigRationalLarge.integer q
static member ToInt32(n:BigRational) =
match n with
| Z z -> ToInt32I(z)
| Q q -> ToInt32I(BigRationalLarge.integer q )
转换为 double 如下所示:
static member ToDouble (Q(p,q)) =
ToDoubleI p / ToDoubleI q
将其打印为分子和分母组合的默认方式:
override n.ToString() =
let (Q(p,q)) = n
if q.IsOne then p.ToString()
else p.ToString() + "/" + q.ToString()
这些都不能真正帮助我们获得更高的精度。在指定要打印的小数位数时无法打印它。
所以回答你的问题:
您可以使用 a 的两个BigInt
部分创建一个打印您想要的值的函数,BigRational
或者您可以编写一个全新的类型来为您执行此操作,但现在还没有类似的东西。