有人可以告诉正确的方法来计算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
答案 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