阅读文档- http://golang.org/pkg/math/big/
Mod将z设置为y != 0时的模x%y并返回z。如果y == 0,则会发生被零除的运行时恐慌。Mod实现欧几里得模(不像Go);
10%4 = 2,但我得到8与此(使用math/big包做同样的事情)- 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)
}
我很可能弄错了。错在哪里?
这是因为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)
只是对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)
}