我们应该如何计算货币(十进制,大浮点数)

时间:2019-09-24 21:56:16

标签: go

有人可以告诉正确的方法来计算Go中的财务数据。我尝试使用big.Float,但是可能我错过了一些东西。核心目标是计算浮点数和精度从2到4的数字,而不会造成任何损失。 0.15 + 0.15始终应为0.30。 float尝试: https://play.golang.org/p/_3CXtRRNcA0 big.Float尝试: https://play.golang.org/p/zegE__Dit1O

2 个答案:

答案 0 :(得分:5)

浮点数不精确。使用整数(int64),将其缩放为美分或分数美分。


例如,美分

package main

import (
    "fmt"
)

func main() {
    cents := int64(0)
    for i := 0; i <= 2; i++ {
        cents += 15
        fmt.Println(cents)
    }
    fmt.Printf("$%d.%02d\n", cents/100, cents%100)
}

游乐场:https://play.golang.org/p/k4mJZFRUGVH

输出:

15
30
45
$0.45

例如,四分之一角四舍五入,

package main

import "fmt"

func main() {
    c := int64(0) // hundredths of a cent
    for i := 0; i <= 2; i++ {
        c += 1550
        fmt.Println(c)
    }
    c += 50 // rounded
    fmt.Printf("$%d.%02d\n", c/10000, c%10000/100)
}

游乐场:https://play.golang.org/p/YGW9SC7OcU3

输出:

1550
3100
4650
$0.47

答案 1 :(得分:1)

如果您真的很担心精度,可以尝试https://github.com/shopspring/decimal

尝试此代码:

package main

import (
    "fmt"

    "github.com/shopspring/decimal"
)

func main() {

    z := decimal.NewFromFloat(0)

    b := decimal.NewFromFloat(0.15)

    z = z.Add(b)
    z = z.Add(b)
    z = z.Add(b)

    fmt.Println("z value:", z)

    testz := z.Cmp(decimal.NewFromFloat(0.45)) == 0

    fmt.Println("is z pass the test? ", testz)

}

游乐场:https://play.golang.org/p/g_fSGlXPKDH

输出:

z value: 0.45
is z pass the test?  true