github.com/shopspring/decimal: FromString和FromFloat产生的不同值.&l



我正在尝试使用gomock来模拟接受小数的接口。usecase:

v, err := decimal.NewFromString(order.Value)
if err != nil {
return err
}
if err := p.CDI.CreateBuyEvent(ctx, v); err != nil {
return err
}

在测试中:

value := decimal.NewFromFloat64(1000)
cfg.cdi.EXPECT().CreateBuyEvent(ctx, value).Return(nil)

运行这个,我得到:

expected call doesn't match the argument at index 1.
Got: 1000 (entities.Order)
Want: is equal to 1000 (entities.Order)

但是,如果我在测试中使用NewFromString("1000")实例化小数,它就通过了。我的问题是:为什么NewFromStringNewFromFloat的潜在值不同?

因为这两个值恰好有不同的内存表示,而逻辑上包含相同的值。

使用Equal方法比较shopspring.Decimal

示范:

package main
import (
"fmt"
"github.com/shopspring/decimal"
)
func main() {
fs, err := decimal.NewFromString("1000")
if err != nil {
panic(err)
}
ff := decimal.NewFromFloat(1000)
if ff != fs {
fmt.Printf("%#v != %#vn", fs, ff)
}
fmt.Println(ff.Equal(fs))
}

生产:

decimal.Decimal{value:(*big.Int)(0xc0001103a0), exp:0} != decimal.Decimal{value:(*big.Int)(0xc0001103c0), exp:3}
true

操场。


我想补充一点,没有必要急于让SO问这样的问题:您应该首先执行至少最小的调试。实际上,如果你有两个必须相同的值,但它们使用==运算符进行比较时不相等,这是愚蠢的——它按字段比较struct的值,——只需看看这些值实际包含什么。