相关疑难解决方法(0)

为什么多次添加0.1会保持无损?

我知道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)

java floating-point precision double

148
推荐指数
2
解决办法
1万
查看次数

Golang Round最近的0.05

我正在寻找一个在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)

我现在已经搜索了很多年,并没有找到任何答案.

math rounding go

28
推荐指数
1
解决办法
2万
查看次数

为什么这两个float64具有不同的值?

考虑这两种情况:

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文字替换它们?

floating-point floating-accuracy go

9
推荐指数
2
解决办法
444
查看次数

对于常量表达式和其他表达式,编译器的评估是否有所不同

为什么下面的代码无法编译?

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)

evaluation bit-manipulation bit-shift go bitwise-operators

4
推荐指数
1
解决办法
450
查看次数

Golang将float64转换为int错误

在将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)

floating-point precision go

3
推荐指数
1
解决办法
1546
查看次数

Go如何对常量执行算术运算?

我一直在阅读关于Go中常量的这篇文章,我试图理解它们是如何在内存中存储和使用的.您可以在Go中对非常大的常量执行操作,只要结果适合内存,您就可以将结果强制转换为类型.例如,10正如您所期望的那样打印此代码:

const Huge = 1e1000
fmt.Println(Huge / 1e999)
Run Code Online (Sandbox Code Playgroud)

这是如何工作的?在某些时候,Go必须存储1e1000并1e999在内存中,以便对它们执行操作.那么常量如何存储,以及Go如何对它们进行算术运算?

const go

3
推荐指数
1
解决办法
459
查看次数

Go:使用乘数将float64转换为int

我想转换一个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上进行这种操作的正确方法是什么?

floating-point type-conversion go

2
推荐指数
1
解决办法
1680
查看次数

按时间段的分数睡觉

有人能告诉我为什么这样有效:

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)

time types const type-conversion go

1
推荐指数
1
解决办法
484
查看次数