当前位置: > > > > 如何修复“(1<<100)*0.1 和 (1<<100)/10”
来源:stackoverflow
2024-04-26 09:09:33
0浏览
收藏
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《如何修复“(1
问题内容
在a tour of go中,数值常量部分,代码是
package main import "fmt" const ( // Create a huge number by shifting a 1 bit left 100 places. // In other words, the binary number that is 1 followed by 100 zeroes. Big = 1 << 100 // Shift it right again 99 places, so we end up with 1<<1, or 2. Small = Big >> 99 ) func needInt(x int) int { return x*10 + 1 } func needFloat(x float64) float64 { return x * 0.1 } func main() { fmt.Println(needInt(Small)) fmt.Println(needFloat(Small)) fmt.Println(needFloat(Big)) fmt.Println(Big * 0.1) //one fmt.Println(Big / 10) //two }
fmt.println(big*0.1)
输出 1.2676506002282295e+29
, 但是 fmt.println(big / 10)
抛出错误:constant 126765060022822940149670320537 溢出 int
, 他们之间有什么区别。
解决方案
摘自 go 博客 :
数字常量存在于任意精度的数字空间中;他们 只是普通数字。但是当它们被分配给一个变量时 值必须能够适合目的地。
一个例子可以让这一点更清楚:
const f = 1 << 31 x := f / 10 // what type is x? y := f * 0.1 // what type is y? fmt.printf(" 10 : type = %8t\n", 10) // int fmt.printf("0.1 : type = %8t\n\n", 0.1) // float64 fmt.printf(" x : type = %8t value = %v\n", x, x) fmt.printf(" y : type = %8t value = %v\n", y, y)
输出:
10 : type = int 0.1 : type = float64 x : type = int value = 214748364 y : type = float64 value = 2.147483648e+08
x
是int
,因为除数10
被解释为int
。y
是float64
,因为乘数0.1
被解释为float64
。
在示例中,const 是 1<<100
,它太大,无法放入 int
(32 位),因此程序甚至无法编译,因为该数字无法存储到分配的内存类型中:100位不适合 32 位 int
。
今天关于《如何修复“(1