]> Cypherpunks.ru repositories - gostls13.git/commitdiff
Revert "fmt: fix incorrect format of whole-number floats when using %#v"
authorFilippo Valsorda <filippo@golang.org>
Tue, 16 Oct 2018 17:01:07 +0000 (13:01 -0400)
committerFilippo Valsorda <filippo@golang.org>
Tue, 16 Oct 2018 21:54:35 +0000 (21:54 +0000)
Numbers without decimals are valid Go representations of whole-number
floats. That is, "var x float64 = 5" is valid Go. Avoid breakage in
tests that expect a certain output from %#v by reverting to it.

To guarantee the right type is generated by a print use %T(%#v) instead.

Added a test to lock in this behavior.

This reverts commit 7c7cecc1846aaaa0ce73931644fe1df2b4559e09.

Fixes #27634
Updates #26363

Change-Id: I544c400a0903777dd216452a7e86dfe60b0b0283
Reviewed-on: https://go-review.googlesource.com/c/142597
Run-TryBot: Filippo Valsorda <filippo@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/fmt/fmt_test.go
src/fmt/format.go
test/switch5.go

index d63271a805b86840116d9a7c88a8f2eef990be72..e97372225c9a886f269a19e29516ea3ae3231830 100644 (file)
@@ -686,11 +686,10 @@ var fmtTests = []struct {
        {"%#v", 1.2345678, "1.2345678"},
        {"%#v", float32(1.2345678), "1.2345678"},
 
-       // Whole number floats should have a single trailing zero added, but not
-       // for exponent notation.
-       {"%#v", 1.0, "1.0"},
+       // Whole number floats are printed without decimals. See Issue 27634.
+       {"%#v", 1.0, "1"},
        {"%#v", 1000000.0, "1e+06"},
-       {"%#v", float32(1.0), "1.0"},
+       {"%#v", float32(1.0), "1"},
        {"%#v", float32(1000000.0), "1e+06"},
 
        // Only print []byte and []uint8 as type []byte if they appear at the top level.
index 3a3cd8d1a1eb0adfeb40faee208042322495452c..91103f2c07f1804af09fc0cac9fb4282c6c762dd 100644 (file)
@@ -481,19 +481,15 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
                return
        }
        // The sharp flag forces printing a decimal point for non-binary formats
-       // and retains trailing zeros, which we may need to restore. For the sharpV
-       // flag, we ensure a single trailing zero is present if the output is not
-       // in exponent notation.
-       if f.sharpV || (f.sharp && verb != 'b') {
+       // and retains trailing zeros, which we may need to restore.
+       if f.sharp && verb != 'b' {
                digits := 0
-               if !f.sharpV {
-                       switch verb {
-                       case 'g', 'G':
-                               digits = prec
-                               // If no precision is set explicitly use a precision of 6.
-                               if digits == -1 {
-                                       digits = 6
-                               }
+               switch verb {
+               case 'v', 'g', 'G':
+                       digits = prec
+                       // If no precision is set explicitly use a precision of 6.
+                       if digits == -1 {
+                               digits = 6
                        }
                }
 
@@ -502,32 +498,25 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) {
                var tailBuf [5]byte
                tail := tailBuf[:0]
 
-               var hasDecimalPoint, hasExponent bool
+               hasDecimalPoint := false
                // Starting from i = 1 to skip sign at num[0].
                for i := 1; i < len(num); i++ {
                        switch num[i] {
                        case '.':
                                hasDecimalPoint = true
                        case 'e', 'E':
-                               hasExponent = true
                                tail = append(tail, num[i:]...)
                                num = num[:i]
                        default:
                                digits--
                        }
                }
-               if f.sharpV {
-                       if !hasDecimalPoint && !hasExponent {
-                               num = append(num, '.', '0')
-                       }
-               } else {
-                       if !hasDecimalPoint {
-                               num = append(num, '.')
-                       }
-                       for digits > 0 {
-                               num = append(num, '0')
-                               digits--
-                       }
+               if !hasDecimalPoint {
+                       num = append(num, '.')
+               }
+               for digits > 0 {
+                       num = append(num, '0')
+                       digits--
                }
                num = append(num, tail...)
        }
index 6641d582bcbaf74a3881228453851c45a4fbf388..ce95bf8d7b1b4f8c7328900ec18e64b50d091e00 100644 (file)
@@ -24,8 +24,8 @@ func f0(x int) {
 func f1(x float32) {
        switch x {
        case 5:
-       case 5: // ERROR "duplicate case 5 .value 5\.0. in switch"
-       case 5.0: // ERROR "duplicate case 5 .value 5\.0. in switch"
+       case 5: // ERROR "duplicate case 5 in switch"
+       case 5.0: // ERROR "duplicate case 5 in switch"
        }
 }
 
@@ -44,9 +44,9 @@ func f3(e interface{}) {
        case 0: // ERROR "duplicate case 0 in switch"
        case int64(0):
        case float32(10):
-       case float32(10): // ERROR "duplicate case float32\(10\) .value 10\.0. in switch"
+       case float32(10): // ERROR "duplicate case float32\(10\) .value 10. in switch"
        case float64(10):
-       case float64(10): // ERROR "duplicate case float64\(10\) .value 10\.0. in switch"
+       case float64(10): // ERROR "duplicate case float64\(10\) .value 10. in switch"
        }
 }