请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)
这样一个看似简单的数字如何在64位内存中表达"太大" ?
只要使用浮点数,0.1就不能在内存中精确表示,所以我们知道这个值通常是0.10000000000000004.
但是当使用go时加0.1和0.2.我得到0.3.
fmt.Println(0.1 + 0.2)
// Output : 0.3
Run Code Online (Sandbox Code Playgroud)
为什么0.3出来而不是0.30000000000000004?
为什么下面的代码无法编译?
package main
import (
"fmt"
"unsafe"
)
var x int = 1
const (
ONE int = 1
MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)
func main() {
fmt.Println(MIN_INT)
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
main.go:12:常量2147483648溢出int
以上陈述是正确的.是的,2147483648溢出int(在32位架构中).但是班次操作应该导致负值,即-2147483648.
但相同的代码工作,如果我将常量更改为变量,我得到预期的输出.
package main
import (
"fmt"
"unsafe"
)
var x int = 1
var (
ONE int = 1
MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)
func main() {
fmt.Println(MIN_INT)
}
Run Code Online (Sandbox Code Playgroud) 我正在观看 FOSDEM '17 上关于在 Go 中实现“tail -f”的演讲 => https://youtu.be/lLDWF59aZAo
在作者最初的示例程序中,他Reader使用文件句柄创建了一个文件,然后使用ReadString带有分隔符“\n”的方法逐行读取文件并打印其内容。我通常使用Scanner,所以这对我来说是新的。
程序如下 | 去游乐场链接
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fileHandle, err := os.Open("someFile.log")
if err != nil {
log.Fatalln(err)
return
}
defer fileHandle.Close()
reader := bufio.NewReader(fileHandle)
for {
line, err := reader.ReadString('\n')
if err != nil {
log.Fatalln(err)
break
}
fmt.Print(line)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,ReadString采用一个字节作为其分隔符参数[ https://golang.org/pkg/bufio/#Reader.ReadString]
所以我的问题是,到底是如何将 '\n'(即 a )rune转换为 a 的byte?我无法理解这个问题。特别是因为byte …