]> Cypherpunks repositories - gostls13.git/commitdiff
strconv: fix %.1f, 0.09
authorRob Pike <r@golang.org>
Tue, 29 Jun 2010 23:51:56 +0000 (16:51 -0700)
committerRob Pike <r@golang.org>
Tue, 29 Jun 2010 23:51:56 +0000 (16:51 -0700)
Fixes #822.
Credit to https://golang.org/cl/1442041 by danielfleischman

R=rsc
CC=golang-dev
https://golang.org/cl/1738047

src/pkg/strconv/atof_test.go
src/pkg/strconv/decimal.go
src/pkg/strconv/ftoa_test.go

index 30f1b05bab1c8066cd22a992770e6a5c494b4168..0039a6e440830d1fbb298e2d8b885c5c96bd2e72 100644 (file)
@@ -74,8 +74,10 @@ var atoftests = []atofTest{
        atofTest{"1e-322", "1e-322", nil},
        // smallest denormal
        atofTest{"5e-324", "5e-324", nil},
+       atofTest{"4e-324", "5e-324", nil},
+       atofTest{"3e-324", "5e-324", nil},
        // too small
-       atofTest{"4e-324", "0", nil},
+       atofTest{"2e-324", "0", nil},
        // way too small
        atofTest{"1e-350", "0", nil},
        atofTest{"1e-400000", "0", nil},
index b3348512f4a1ea5d7ed021c9273ac0ab018d68b6..3be61d7bc707fddcf5c7a6688f97e94e90f8cf85 100644 (file)
@@ -289,11 +289,11 @@ func (a *decimal) Shift(k int) *decimal {
 
 // If we chop a at nd digits, should we round up?
 func shouldRoundUp(a *decimal, nd int) bool {
-       if nd <= 0 || nd >= a.nd {
+       if nd < 0 || nd >= a.nd {
                return false
        }
        if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even
-               return (a.d[nd-1]-'0')%2 != 0
+               return nd > 0 && (a.d[nd-1]-'0')%2 != 0
        }
        // not halfway - digit tells all
        return a.d[nd] >= '5'
@@ -301,8 +301,11 @@ func shouldRoundUp(a *decimal, nd int) bool {
 
 // Round a to nd digits (or fewer).
 // Returns receiver for convenience.
+// If nd is zero, it means we're rounding
+// just to the left of the digits, as in
+// 0.09 -> 0.1.
 func (a *decimal) Round(nd int) *decimal {
-       if nd <= 0 || nd >= a.nd {
+       if nd < 0 || nd >= a.nd {
                return a
        }
        if shouldRoundUp(a, nd) {
@@ -314,7 +317,7 @@ func (a *decimal) Round(nd int) *decimal {
 // Round a down to nd digits (or fewer).
 // Returns receiver for convenience.
 func (a *decimal) RoundDown(nd int) *decimal {
-       if nd <= 0 || nd >= a.nd {
+       if nd < 0 || nd >= a.nd {
                return a
        }
        a.nd = nd
@@ -325,7 +328,7 @@ func (a *decimal) RoundDown(nd int) *decimal {
 // Round a up to nd digits (or fewer).
 // Returns receiver for convenience.
 func (a *decimal) RoundUp(nd int) *decimal {
-       if nd <= 0 || nd >= a.nd {
+       if nd < 0 || nd >= a.nd {
                return a
        }
 
index cc01ccd7804e02b04e3e466a953b9f9c395c3c3a..49832b6266f0301a49aa9f7b58468781c6ac9c60 100644 (file)
@@ -108,6 +108,16 @@ var ftoatests = []ftoaTest{
        ftoaTest{-math.Inf(0), 'g', -1, "-Inf"},
 
        ftoaTest{-1, 'b', -1, "-4503599627370496p-52"},
+
+       // fixed bugs
+       ftoaTest{0.9, 'f', 1, "0.9"},
+       ftoaTest{0.09, 'f', 1, "0.1"},
+       ftoaTest{0.0999, 'f', 1, "0.1"},
+       ftoaTest{0.05, 'f', 1, "0.1"},
+       ftoaTest{0.05, 'f', 0, "0"},
+       ftoaTest{0.5, 'f', 1, "0.5"},
+       ftoaTest{0.5, 'f', 0, "0"},
+       ftoaTest{1.5, 'f', 0, "2"},
 }
 
 func TestFtoa(t *testing.T) {