[求指教] Golang 浮点数有个疑问

2020-07-02 19:07:33 +08:00
 tqz

问题描述

float32 的精度是小数点后面 6 位,这个我没说错吧。。(万一我记错了请批我)

那么我的理解就是把 float3210000018 表示成科学计数法就应该是:1.000002e+07 (四舍五入了)

但是 go 输出的结果是:1.0000018e+07,代码如下

package main

import "fmt"

var num float32 = 10000018 // 8 位 <==> 1.0000018 * 10^7

func main() {

	fmt.Println("num: ", num) // 1.0000018e+07 ??小数点后面怎么有 7 位

}

小数点后面怎么有 7 位?和我预想的不一样。。

并且

并且我把 10000018 加个 7 得到 100000187 然后再试一次,又变成小数点后 8 位了,代码如下:

package main

import "fmt"

//var myfloat float32 = 10000018 // 8 位 <==> 1.0000018 * 10^7

var myfloat float32 = 100000182 // 9 位 <==>  1.00000182 * 10^8
var ans float32 = 100000187     // 9 位 <==>  1.00000187 * 10^8

func main() {
	
	fmt.Println("myfloat: ", myfloat) // 1.00000184e+08
	fmt.Println(myfloat == myfloat + 1) // true
	fmt.Println("myfloat: ", myfloat+5) // 1.0000019e+08
	fmt.Println(ans == myfloat+5) // false
}

1.00000184e+08 这个数有 8 个小数,我不太懂了。。

关于 IEEE-754 的介绍我也看了,还是有疑惑。

求大神指教。

1449 次点击
所在节点    程序员
4 条回复
InkStone
2020-07-02 19:14:55 +08:00
你是怎么做到看了 IEEE754 还能把 float 理解成”小数点后保留六位小数“的?

float 按二进制取整,输出成十进制有几位小数纯看运气和输出格式
reus
2020-07-02 19:18:52 +08:00
知道浮点数为啥叫“浮点”数吗?
就是小数点位置是不固定的,所以你一开始就错了
1010543618
2020-07-02 19:33:29 +08:00
计算机组成原理忘得差不多了
随便找了个介绍 https://www.runoob.com/w3cnote/32-float-storage.html,貌似规格化之后能有 24 bit (16777216) 的精度
ipwx
2020-07-02 19:54:05 +08:00
1.00000184e+08 这个数有 8 个小数:

楼主你真的看了浮点数标准么?
----

首先 3L 给了你一个资料了,32 位浮点数的底数最多能有 24 bit,也就是最多八位( 2**24 = 16777216 )。剩下 8 位是指数,所以指数最多是 e128 这个量级。和小数点以后到底多少位根本没有关系,看的是指数和底数的有效数位。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686654

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX