阅读文档 - http://golang.org/pkg/math/big/
Mod将z设置为y!= 0的模数x%y并返回z。如果y == 0,则发生逐个零的运行时恐慌。 Mod实现欧氏模数(与Go不同);有关详细信息,请参阅DivMod。
10%4 = 2但我得到8(使用数学/大包来做同样的事情) - http://play.golang.org/p/_86etDvLYq
package main
import "fmt"
import "math/big"
import "strconv"
func main() {
ten := new(big.Int)
ten.SetBytes([]byte(strconv.Itoa(10)))
four := new(big.Int)
four.SetBytes([]byte(strconv.Itoa(4)))
tenmodfour := new(big.Int)
tenmodfour = tenmodfour.Mod(ten, four)
fmt.Println("mod", tenmodfour)
}
我很可能出了点问题。错误在哪里?
答案 0 :(得分:4)
这是因为SetBytes
没有按照你的想法行事!请改用SetInt64
。
ten := new(big.Int)
ten.SetBytes([]byte(strconv.Itoa(10)))
four := new(big.Int)
four.SetBytes([]byte(strconv.Itoa(4)))
fmt.Println(ten, four)
结果:
12592 52
确实,12592%52 == 8
如果您想使用大于int64
允许操作的数字,您还可以使用SetString
函数:
n := new(big.Int)
n.SetString("456135478645413786350", 10)
答案 1 :(得分:2)
只需添加julienc的答案,如果您使用SetBytes
,则必须将数字转换为this
之类的字节:
func int2bytes(num int) (b []byte) {
b = make([]byte, 4)
binary.BigEndian.PutUint32(b, uint32(num))
return
}
func main() {
ten := new(big.Int)
ten.SetBytes(int2bytes(10))
four := new(big.Int)
four.SetBytes(int2bytes(4))
fmt.Println(ten, four)
tenmodfour := new(big.Int)
tenmodfour = tenmodfour.Mod(ten, four)
fmt.Println("mod", tenmodfour)
}