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