mirror of
https://github.com/golang/go
synced 2024-11-21 14:14:40 -07:00
strconv: fix %.1f, 0.09
Fixes #822. Credit to https://golang.org/cl/1442041 by danielfleischman R=rsc CC=golang-dev https://golang.org/cl/1738047
This commit is contained in:
parent
21f8ae8fec
commit
64b6a789a1
@ -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},
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user