我知道0.1十进制数不能用有限的二进制数(解释)精确表示,所以double n = 0.1会失去一些精度而不会完全正确0.1.另一方面0.5可以完全表示,因为它是0.5 = 1/2 = 0.1b.
已经说过,添加0.1 三次不会完全给出0.3以下代码打印是可以理解的false:
double sum = 0, d = 0.1;
for (int i = 0; i < 3; i++)
sum += d;
System.out.println(sum == 0.3); // Prints false, OK
Run Code Online (Sandbox Code Playgroud)
但是,如何增加0.1 五次才会给出确切的答案0.5呢?以下代码打印true:
double sum = 0, d = 0.1;
for (int i = 0; i < 5; i++)
sum += …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个在Golang中舍入到最接近的0.05的函数.使用该函数的最终结果必须始终为0.05.
以下是我正在寻找的函数的一些输出示例:(函数Round尚不存在,我希望它可以包含在答案中)
Round(0.363636) // 0.35
Round(3.232) // 3.25
Round(0.4888) // 0.5
Run Code Online (Sandbox Code Playgroud)
我现在已经搜索了很多年,并没有找到任何答案.
考虑这两种情况:
fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
Run Code Online (Sandbox Code Playgroud)
(去游乐场链接)
第二个打印9.120000000000001,这实际上很好,我明白为什么会这样.
但是,为什么第一行打印9.12,最后没有... 01?Go是否将两个无类型常量相乘,并在编译时简单地用9.12文字替换它们?
为什么下面的代码无法编译?
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) 在将float转换为int时,如何避免浮点错误.例如,下面的代码打印出来:0.5499999999999972当我想要打印时0.55.
package main
import "fmt"
func main() {
x := 100.55
fmt.Println(x - float64(int(x)))
}
Output:
0.5499999999999972
Run Code Online (Sandbox Code Playgroud) 我一直在阅读关于Go中常量的这篇文章,我试图理解它们是如何在内存中存储和使用的.您可以在Go中对非常大的常量执行操作,只要结果适合内存,您就可以将结果强制转换为类型.例如,10正如您所期望的那样打印此代码:
const Huge = 1e1000
fmt.Println(Huge / 1e999)
Run Code Online (Sandbox Code Playgroud)
这是如何工作的?在某些时候,Go必须存储1e1000并1e999在内存中,以便对它们执行操作.那么常量如何存储,以及Go如何对它们进行算术运算?
我想转换一个float64数字,让我们也说1.003要1003(整型).我的实现只是将float64with 乘以1000并将其转换为int.
package main
import "fmt"
func main() {
var f float64 = 1.003
fmt.Println(int(f * 1000))
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行该代码时,我得到的1002不是1003.因为Go会自动存储1.003为1.002999...变量.在Golang上进行这种操作的正确方法是什么?
有人能告诉我为什么这样有效:
s := time.Hour/73.0
fmt.Println("sleeping: ", s)
time.Sleep(s)
Run Code Online (Sandbox Code Playgroud)
但这失败了:
d := 73.0
s := time.Hour/d
fmt.Println("sleeping: ", s)
time.Sleep(s)
Run Code Online (Sandbox Code Playgroud)
这是错误:
invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Run Code Online (Sandbox Code Playgroud)