2021年03月18日 golang 以太坊大额转账转换问题
斜杠青年_728f · · 1091 次点击 · · 开始浏览构建以太坊普通交易结构的时候,有个 value参数,类型为 *Int,
正常情况下直接 value := big.NewInt(100000000000000000000) 1ETH
当想转更多时,比如100eth,1000eth 就会报 int64溢出出错
正确的做法是 : 为方便入参,从上游接收一个string类型的value,
然后
valuef, err := strconv.ParseFloat(value,64) //先转换为 float64
if err != nil {
log.Println("is not a number")
}
// 再通过sprintf格式化为*Int
valueWei, isOk := new(big.Int).SetString(fmt.Sprintf("%.0f", valuef*1000000000000000000), 10)
if !isOk {
log.Println("float to bigInt failed!")
}
此时就不会溢出了,同样 *Int也有转换为string的方法
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
构建以太坊普通交易结构的时候,有个 value参数,类型为 *Int,
正常情况下直接 value := big.NewInt(100000000000000000000) 1ETH
当想转更多时,比如100eth,1000eth 就会报 int64溢出出错
正确的做法是 : 为方便入参,从上游接收一个string类型的value,
然后
valuef, err := strconv.ParseFloat(value,64) //先转换为 float64
if err != nil {
log.Println("is not a number")
}
// 再通过sprintf格式化为*Int
valueWei, isOk := new(big.Int).SetString(fmt.Sprintf("%.0f", valuef*1000000000000000000), 10)
if !isOk {
log.Println("float to bigInt failed!")
}
此时就不会溢出了,同样 *Int也有转换为string的方法