mirror of
https://github.com/golang/go
synced 2024-11-22 00:14:42 -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},
|
atofTest{"1e-322", "1e-322", nil},
|
||||||
// smallest denormal
|
// smallest denormal
|
||||||
atofTest{"5e-324", "5e-324", nil},
|
atofTest{"5e-324", "5e-324", nil},
|
||||||
|
atofTest{"4e-324", "5e-324", nil},
|
||||||
|
atofTest{"3e-324", "5e-324", nil},
|
||||||
// too small
|
// too small
|
||||||
atofTest{"4e-324", "0", nil},
|
atofTest{"2e-324", "0", nil},
|
||||||
// way too small
|
// way too small
|
||||||
atofTest{"1e-350", "0", nil},
|
atofTest{"1e-350", "0", nil},
|
||||||
atofTest{"1e-400000", "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?
|
// If we chop a at nd digits, should we round up?
|
||||||
func shouldRoundUp(a *decimal, nd int) bool {
|
func shouldRoundUp(a *decimal, nd int) bool {
|
||||||
if nd <= 0 || nd >= a.nd {
|
if nd < 0 || nd >= a.nd {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even
|
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
|
// not halfway - digit tells all
|
||||||
return a.d[nd] >= '5'
|
return a.d[nd] >= '5'
|
||||||
@ -301,8 +301,11 @@ func shouldRoundUp(a *decimal, nd int) bool {
|
|||||||
|
|
||||||
// Round a to nd digits (or fewer).
|
// Round a to nd digits (or fewer).
|
||||||
// Returns receiver for convenience.
|
// 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 {
|
func (a *decimal) Round(nd int) *decimal {
|
||||||
if nd <= 0 || nd >= a.nd {
|
if nd < 0 || nd >= a.nd {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
if shouldRoundUp(a, nd) {
|
if shouldRoundUp(a, nd) {
|
||||||
@ -314,7 +317,7 @@ func (a *decimal) Round(nd int) *decimal {
|
|||||||
// Round a down to nd digits (or fewer).
|
// Round a down to nd digits (or fewer).
|
||||||
// Returns receiver for convenience.
|
// Returns receiver for convenience.
|
||||||
func (a *decimal) RoundDown(nd int) *decimal {
|
func (a *decimal) RoundDown(nd int) *decimal {
|
||||||
if nd <= 0 || nd >= a.nd {
|
if nd < 0 || nd >= a.nd {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
a.nd = nd
|
a.nd = nd
|
||||||
@ -325,7 +328,7 @@ func (a *decimal) RoundDown(nd int) *decimal {
|
|||||||
// Round a up to nd digits (or fewer).
|
// Round a up to nd digits (or fewer).
|
||||||
// Returns receiver for convenience.
|
// Returns receiver for convenience.
|
||||||
func (a *decimal) RoundUp(nd int) *decimal {
|
func (a *decimal) RoundUp(nd int) *decimal {
|
||||||
if nd <= 0 || nd >= a.nd {
|
if nd < 0 || nd >= a.nd {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +108,16 @@ var ftoatests = []ftoaTest{
|
|||||||
ftoaTest{-math.Inf(0), 'g', -1, "-Inf"},
|
ftoaTest{-math.Inf(0), 'g', -1, "-Inf"},
|
||||||
|
|
||||||
ftoaTest{-1, 'b', -1, "-4503599627370496p-52"},
|
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) {
|
func TestFtoa(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user