| // 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"; |
| "fmt"; |
| "go/token"; |
| ) |
| |
| // 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; |
| } |