【问题标题】:Float64 type printing as int in Golang在 Golang 中将 Float64 类型打印为 int
【发布时间】:2019-11-23 16:17:08
【问题描述】:

令人惊讶的是,我找不到其他人遇到同样的问题;我尝试简单地在 Go 中初始化一个 float64 并打印它,然后尝试进行字符串转换并打印它。两个输出都不准确。

我尝试了很多分数,包括那些不能解析为重复小数的分数,以及简单地写出浮点数和打印(例如num := 1.5 然后fmt.Println(num) 给出输出1)。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num float64
    num = 5/3
    fmt.Printf("%v\n", num)
    numString := strconv.FormatFloat(num, 'f', -1, 64)
    fmt.Println(numString)
}

预期:

// Output:
1.66
1.66

实际:

// Output:
1
1

【问题讨论】:

  • downvoter 关心解释一下?

标签: go types floating-point strconv


【解决方案1】:

The Go Programming Language Specification

Integer literals

整数字面量是表示整数的数字序列 常数。

Floating-point literals

浮点字面量是 a 的十进制表示 浮点常数。它有一个整数部分、一个小数点、一个 小数部分和指数部分。整数和小数部分 包括十进制数字;指数部分是一个 e 或 E 后跟一个 可选有符号十进制指数。整数部分之一或 小数部分可以省略;小数点之一或 指数可以省略。

Arithmetic operators

对于两个整数值 x 和 y,整数商 q = x / y 和 余数 r = x % y 满足下列关系:

x = q*y + r  and  |r| < |y|

x / y 向零截断。


你写的,使用整数文字和算术(x / y 向零截断):

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num float64
    num = 5 / 3 // float64(int(5)/int(3))
    fmt.Printf("%v\n", num)
    numString := strconv.FormatFloat(num, 'f', -1, 64)
    fmt.Println(numString)
}

游乐场:https://play.golang.org/p/PBqSbpHvuSL

输出:

1
1

您应该使用浮点文字和算术来编写:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num float64
    num = 5.0 / 3.0 // float64(float64(5.0) / float64 (3.0))
    fmt.Printf("%v\n", num)
    numString := strconv.FormatFloat(num, 'f', -1, 64)
    fmt.Println(numString)
}

游乐场:https://play.golang.org/p/Hp1nac358HK

输出:

1.6666666666666667
1.6666666666666667

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2011-12-22
    • 1970-01-01
    • 2020-05-31
    • 2014-01-13
    相关资源
    最近更新 更多