gpt4 book ai didi

parsing - Golang ParseFloat 在示例中不准确

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:16 26 4
gpt4 key购买 nike

我一直在做一个项目,我必须将字符串转换为 uint,以确保一些货币值匹配:

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")
}

但是当我尝试对几个数字执行 strconv.ParseFloat(),然后尝试将它们乘以 100(以获得美分值)时,我似乎发现了一个问题。

我在这里创建了一个示例: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

在这种情况下我应该使用 ParseFloat() 吗?如果没有,我很想听听对此的简要解释,因为我仍然是一名正在学习的程序员。

最佳答案

Go 使用 IEEE-754二进制 float 。 float 是不精确的。不要将它们用于金融交易。使用整数。

例如,

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

输出:

7935 <nil>
14920 <nil>
-14920 <nil>
0 format error: 149.2

关于parsing - Golang ParseFloat 在示例中不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com