| // 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 | |
| } |