q, r := nat{}.div(nat{}, z.a.abs, z.b)
- s := q.string(10)
- if z.a.neg {
- s = "-" + s
+ p := natOne
+ if prec > 0 {
+ p = nat{}.expNN(natTen, nat{}.setUint64(uint64(prec)), nil)
}
- p := nat{}.expNN(natTen, nat{Word(prec)}, nil)
r = r.mul(r, p)
r, r2 := r.div(nat{}, r, z.b)
// see if we need to round up
- r2 = r2.mul(r2, natTwo)
+ r2 = r2.add(r2, r2)
if z.b.cmp(r2) <= 0 {
r = r.add(r, natOne)
+ if r.cmp(p) >= 0 {
+ q = nat{}.add(q, natOne)
+ r = nat{}.sub(r, p)
+ }
+ }
+
+ s := q.string(10)
+ if z.a.neg {
+ s = "-" + s
}
- rs := r.string(10)
- leadingZeros := prec - len(rs)
- s += "." + strings.Repeat("0", leadingZeros) + rs
- s = strings.TrimRight(s, "0")
+ if prec > 0 {
+ rs := r.string(10)
+ leadingZeros := prec - len(rs)
+ s += "." + strings.Repeat("0", leadingZeros) + rs
+ }
return s
}
floatStringTest{".25", 1, "0.3"},
floatStringTest{"-1/3", 3, "-0.333"},
floatStringTest{"-2/3", 4, "-0.6667"},
+ floatStringTest{"0.96", 1, "1.0"},
+ floatStringTest{"0.999", 2, "1.00"},
+ floatStringTest{"0.9", 0, "1"},
+ floatStringTest{".25", -1, "0"},
+ floatStringTest{".55", -1, "1"},
}
func TestFloatString(t *testing.T) {