- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
运行这段代码看看我的意思:Go Playground demo of issue
package main
import (
"fmt"
"strconv"
)
func main() {
// From https://golang.org/src/math/const.go
var SmallestNonzeroFloat64AsString string = "4.940656458412465441765687928682213723651e-324"
var SmallestNonzeroFloat64 float64
var err error
SmallestNonzeroFloat64, err = strconv.ParseFloat(SmallestNonzeroFloat64AsString, 64)
if err != nil {
panic(err)
}
fmt.Printf("SmallestNonzeroFloat64 = %g\n", SmallestNonzeroFloat64)
fmt.Printf("SmallestNonzeroFloat64 = %s\n", strconv.FormatFloat(SmallestNonzeroFloat64, 'f', -1, 64))
}
SmallestNonzeroFloat64
在 math/const.go 中定义我假设它可以用 float64 变量表示。
但是当使用 strconv.ParseFloat()
将其解析为 float64 并使用 strconv.FormatFloat()
打印时,结果会四舍五入。
而不是 4.940656458412465441765687928682213723651e-324
我得到 5e-324
(或其非指数等效项,您可以在 Go Playground 结果中看到)。结果四舍五入。
有没有办法取回 4.940656458412465441765687928682213723651e-324
?
还是bug?
最佳答案
您可以要求 Go 打印更多数字。
fmt.Printf("SmallestNonzeroFloat64 = %.40g\n", SmallestNonzeroFloat64)
// 4.940656458412465441765687928682213723651e-324
然而,5e-324
和 4.94…e-324
实际上是相同的值,所以 Go 打印 5e-324
并没有错>。此值 (2-1074) 是 Float64(在其他语言中也称为 double
)可表示的最小正数。更大的数字都是这个的倍数,例如下一个最小的数字是 2 × 2-1074 = 1e-323
,下一个是 3 × 10-1074 = 1.5e-323
等
换句话说,所有比 5e-324
更精确的数字都不能用 Float64 表示。所以在“5”之后打印更多数字是没有意义的。而且 5e-324
肯定比 4.94…e-324
更具可读性。
关于go - 这是预期的 strconv.ParseFloat() 行为还是错误?我怎样才能绕过它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826814/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我有以下代码: var i2 uint64; var err error; i2, err = uint64(strconv.ParseInt(scanner.Text(), 64, 64)); 我收
当尝试对通过 URL 传递的变量(GET 变量命名时间)使用 strconv 时,GoLang 编译失败,说明如下: multiple-value strconv.Atoi() in a single
我正在使用以下代码对从string到int和uint的编码进行基准测试: package main import ( "strconv" "testing" ) func Benchm
我有以下测试strconv.Atoi()的基本代码: package main import ( "fmt" "strconv" ) func main() {
我正在尝试解析这种格式的文件: 12 0,1,2,3,1,2,3,4,2,3,4,5 1,0,1,2,2,1,2,3,3,2,3,4 2,1,0,1,3,2,1,2,4,3,2,3 3,2,1,0,4
我最终会编写这样的代码。我需要一个常规的 int(用于其他一些函数调用),但 parseInt 只生成 64 位 int: i64, err := strconv.ParseInt(s, 10, 0)
我只是想使用类型开关来处理时间、float32 和 float64。它适用于时间和 float64s,但 strconv.FormatFloat(val, 'f', -1, 32) 一直告诉我不能使用
我有一个 Excel 文件和一个用户表单,用户可以在其中输入学生的详细信息,该表单将检查是否重复,然后将信息添加到表格的最后一行。我想通过使用以下代码使表单大写每个名称的第一个字母来进一步改进它: M
我想将字符串转换为字节数组。 (是的)我已经看到关于这个主题的多个问题,但我没有发现答案对我有太大帮助。在大多数情况下,问题相当缺乏。我一直在做一些研究,我将在下面发布我的发现。 这些都是我发现的在
我有一个简短的程序,可以将一些二进制数转换成它们的 ASCII 等价物。我试着把它翻译成 go今天发现 strconv.Itoa() 没有像我预期的那样工作。 // translate Compute
我可能在这里遗漏了一些非常简单的东西: package main import ( "fmt" "strconv" "reflect" ) func main() {
过去一天左右,我无缘无故地使用 Go 构建了一个汇编程序,以便熟悉这门语言。这是我使用 Go 的第一个真正的程序,所以我预料到会出现问题,但我一次又一次地遇到一个一致的错误。在其他情况下,我只是想出了
我正在尝试用 Go 制作一个基本的加法计算器(这里完全是菜鸟),但每次我得到的输出都是 0。 这是代码: package main import ( "fmt" "strconv"
运行这段代码看看我的意思:Go Playground demo of issue package main import ( "fmt" "strconv" ) func main()
我写了这样的一次性代码,strconv.Itoa(time.Nanoseconds())。但是,它给我这个错误“不能使用 time.Nanoseconds()(类型 int64)作为函数参数中的类型
这听起来像是一个愚蠢的问题......但我在任何地方都找不到 strconv.Itoa 中的“a”实际上代表什么。如果它取一个整数并把它变成一个字符串,为什么这个函数不叫 Itos? 最佳答案 整数到
我正在尝试在这个小程序中获取用户输入。我已经尝试使用 strconv.Atoi() 方法以多种方式执行此操作(我的输入显然是一个字符串,我正在尝试将其转换为整数)。这是我的第一次尝试: package
我有一个像这样的 STRING slice 数组: [[header1 header2 startdate enddate header3 header4] [item1 100 01/01/2017
我有以下代码: reader := bufio.NewReader(os.Stdin) fmt.Print("room: width x length: ") inStr, _ := reader.R
我是一名优秀的程序员,十分优秀!