blob: 6508346dd9eddbbe8440921d75f9ffad64adb8c8 [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package eval
import (
"bignum"
)
// TODO(austin): Maybe add to bignum in more general form
func ratToString(rat *bignum.Rational) string {
n, dnat := rat.Value()
d := bignum.MakeInt(false, dnat)
w, frac := n.QuoRem(d)
out := w.String()
if frac.IsZero() {
return out
}
r := frac.Abs()
r = r.Mul(bignum.Nat(1e6))
dec, tail := r.DivMod(dnat)
// Round last digit
if tail.Cmp(dnat.Div(bignum.Nat(2))) >= 0 {
dec = dec.Add(bignum.Nat(1))
}
// Strip zeros
ten := bignum.Nat(10)
for !dec.IsZero() {
dec2, r2 := dec.DivMod(ten)
if !r2.IsZero() {
break
}
dec = dec2
}
out += "." + dec.String()
return out
}