Golang中国
package main

    import (
        "fmt"
    )

    func main() {
        a := 1.69
        b := 1.7
        c := a * b//结果应该是2.873
        fmt.Println(c)//输出的是2.8729999999999998
    }

jimmykuu 于 2017-06-18 22:53 修改
7 回复
stevewang
#1 stevewang • 2015-04-02 16:07

要想固定精度还是用整型计算比较合适。

package main

import (
    "fmt"
)

func main() {
    a := 1690 // 表示1.69
    b := 1700 // 表示1.70
    c := a * b//结果应该是2873000表示 2.873
    fmt.Println(c) // 内部编码
    fmt.Println(float64(c) / 1000000) // 显示
}
hilldan
#2 hilldan • 2015-04-02 16:49

用fmt.Printf("%.3f\n",c)试试

CrossRun
#3 CrossRun • 2015-04-02 17:04
    a := 1.69
    b := 1.7
    c := a * b     //结果应该是2.873
    fmt.Println(c) //输出的是2.8729999999999998
    fmt.Println(c / a)
    fmt.Println(c / b)

输出:

2.8729999999999998
1.7
1.69

所以,存储的结果还是对的,要是单纯输出,可以按照楼上的方法

David
#4 David • 2015-04-05 00:35

浮点数来表示实数就是有误差的,这个误差已经很小了,精确到小数点后15位都是正确的呢。

snake117
#5 snake117 • 2015-04-05 22:29

实在不满意就用math/big包的Rat吧,这个可是无限精度。虽然我觉得没啥意义罢了。

bigbear
#6 bigbear • 2015-04-07 14:41

因为他叫浮点,会浮来浮去, 哈哈. 算完, 你按位数四舍五入不就对了.

xjjrocker
#7 xjjrocker • 2017-06-15 09:20

strconv.FormatFloat(c, 'f', 3, 64)就可以了

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。