duanaidang6197 2018-08-08 23:55
浏览 363
已采纳

Golang ParseFloat在示例中不准确

I've been working on a project where I have to convert a string to a uint, to make sure some money values are matching:

total, err := strconv.ParseFloat(paymentResp.Transactions[0].Amount.Total, 64)
if err != nil {
    return ctx.JSON(http.StatusBadRequest, err.Error())
}

if o.TotalPrice != uint(total*100) {
    return ctx.JSON(http.StatusBadRequest, "Unable to verify amount paid")
}

But I've seemingly found a problem when trying to do the strconv.ParseFloat() on a couple of numbers, then attempting to multiply them by 100 (to get the cents value).

I've created an example here: Go Playground

f, _ := strconv.ParseFloat("79.35", 64)
fmt.Println(uint(f*100))  //7934

f2, _ := strconv.ParseFloat("149.20", 64)
fmt.Println(uint(f2*100)) //14919

Is ParseFloat() what I should be using in this scenario? If not, I'd love to hear a brief explanation on this, as I'm still a programmer in learning.

  • 写回答

3条回答 默认 最新

  • douque2016 2018-08-09 12:10
    关注

    Go uses IEEE-754 binary floating-point numbers. Floating-point numbers are imprecise. Don't use them for financial transactions. Use integers.

    For example,

    package main
    
    import (
        "fmt"
        "strconv"
        "strings"
    )
    
    func parseCents(s string) (int64, error) {
        n := strings.SplitN(s, ".", 3)
        if len(n) != 2 || len(n[1]) != 2 {
            err := fmt.Errorf("format error: %s", s)
            return 0, err
        }
        d, err := strconv.ParseInt(n[0], 10, 56)
        if err != nil {
            return 0, err
        }
        c, err := strconv.ParseUint(n[1], 10, 8)
        if err != nil {
            return 0, err
        }
        if d < 0 {
            c = -c
        }
        return d*100 + int64(c), nil
    }
    
    func main() {
        s := "79.35"
        fmt.Println(parseCents(s))
        s = "149.20"
        fmt.Println(parseCents(s))
        s = "-149.20"
        fmt.Println(parseCents(s))
        s = "149.2"
        fmt.Println(parseCents(s))
    }
    

    Playground: https://play.golang.org/p/mGuO51QWyIv

    Output:

    7935 <nil>
    14920 <nil>
    -14920 <nil>
    0 format error: 149.2
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)