V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
tqz
V2EX  ›  程序员

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

  •  
  •   tqz · 2020-07-02 19:07:33 +08:00 · 1661 次点击
    这是一个创建于 1636 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    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 的介绍我也看了,还是有疑惑。

    求大神指教。

    第 1 条附言  ·  2020-07-02 20:19:20 +08:00

    结贴

    不好意思,是我愚昧了,脑子没转过来。

    我现在懂了,以后一定好好阅读文献,不马虎了。

    InkStone
        1
    InkStone  
       2020-07-02 19:14:55 +08:00
    你是怎么做到看了 IEEE754 还能把 float 理解成”小数点后保留六位小数“的?

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

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

    首先 3L 给了你一个资料了,32 位浮点数的底数最多能有 24 bit,也就是最多八位( 2**24 = 16777216 )。剩下 8 位是指数,所以指数最多是 e128 这个量级。和小数点以后到底多少位根本没有关系,看的是指数和底数的有效数位。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:17 · PVG 13:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.