我正在尝试用 Go 进行货币计算。
环顾标准库,big/math似乎是我可以利用的。
我运行了一些代码来检查它是如何工作的。
首先我用 Float.SetFloat64()
var f = 18.9
var f2 = 1.65
bf := new(big.Float)
bf.Add(bf, new(big.Float).SetFloat64(f))
bf.Add(bf, new(big.Float).SetFloat64(f2))
result, _ := bf.Float64()
fmt.Println(result)
这给了我结果:20.549999999999997
就像用float64类型计算一样。
既然我在和钱打交道,结果一定是20.55。
相反,当使用 Float.SetString()
var s = fmt.Sprintf("%f", 18.9)
var s2 = fmt.Sprintf("%f", 1.65)
bf := new(big.Float)
bf2, _ := new(big.Float).SetString(s)
bf3, _ := new(big.Float).SetString(s2)
bf.Add(bf, bf2)
bf.Add(bf, bf3)
result, _ := bf.Float64()
fmt.Println(result)
这给了我结果:20.55
似乎我可以将它用于我的目的(但我不确定..)。
我的问题是
为什么使用Float.SetFloat64()和 之间有区别Float.SetString()?
Float.SetString()用于货币计算时是否有任何陷阱?
提前致谢,请原谅我的英语。
[编辑]
我知道应该避免使用浮点类型来表示货币价值。
但类型的选择并不在我的控制之下..
我想知道以上两个问题中的一个(或两个)的答案。
或者为什么Float.SetString()给我看似正确的结果的原因也很有帮助。
凤凰求蛊
肥皂起泡泡
暮色呼如
相关分类