代码之家  ›  专栏  ›  技术社区  ›  user_78361084

不能四舍五入到最接近的.0001

go
  •  0
  • user_78361084  · 技术社区  · 6 年前

    我有以下资料:

    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main() {
        nums := []float64{
            0.15807659924030304, 0.10901273787021637, 0.04955724626779556, 0.05886702239513397,
        }
    
        for _, f := range nums {
            fmt.Println(f, math.Round(f/.0001)*.0001)
        }
    }
    

    输出为:

    0.15807659924030304 0.15810000000000002
    0.10901273787021637 0.109
    0.04955724626779556 0.049600000000000005
    0.05886702239513397 0.0589
    

    为什么有些以4位小数结尾?如何更正?

    https://play.golang.org/p/kLvVjmsjq6Y

    1 回复  |  直到 6 年前
        1
  •  4
  •   Zan Lynx    6 年前
            fmt.Printf("%f %b %0.4f\n", f, f, math.Round(f/.0001)*.0001)
    

    试着用那个。这个 %0.4f 将其格式化为4个小数位。实际上,如果您只需要字符串,请使用该字符串而不是使用round函数。

    这个 %b 会告诉你真正的价值。在go中,它将显示一个大的十进制(以10为基数)值,一个p,然后是2的幂指数。所以当它显示 5695309707476992p-55 你可以通过做 5695309707476992 / 2^55