出于某种原因,即使 mod 结果实际上是正确的,当我测试相等性时,我还是从 big int 得到了错误的结果!例如,我想计算 2015%2 结果为 1。
当我使用 big int 时,当我这样做时我会得到错误:
fmt.Println((test.Mod(big.NewInt(2015),big.NewInt(2)))==big.NewInt(1))
Run Code Online (Sandbox Code Playgroud)
但是,当我使用常规 int 时,我得到了正确的结果(无论如何这是正确的):
fmt.Println(2015%2==1)
Run Code Online (Sandbox Code Playgroud)
使用 big int 时,我是否应该以不同的方式进行相等?
Run Code Online (Sandbox Code Playgroud)import "math/big"Run Code Online (Sandbox Code Playgroud)func NewInt(x int64) *IntNewInt 分配并返回一个设置为 x 的新 Int。
Run Code Online (Sandbox Code Playgroud)func (x *Int) Cmp(y *Int) (r int)Cmp 比较 x 和 y 并返回:
Run Code Online (Sandbox Code Playgroud)-1 if x < y 0 if x == y +1 if x > y
变量a和b是指针:*big.Int。使用该Cmp方法来比较值。例如,
package main
import (
"fmt"
"math/big"
)
func main() {
a := big.NewInt(42)
fmt.Printf("a: %[1]T %[1]p %[1]v\n", a)
b := big.NewInt(42)
fmt.Printf("b: %[1]T %[1]p %[1]v\n", b)
fmt.Println("pointers:", a == b) // compare pointers
fmt.Println("values: ", a.Cmp(b) == 0) // compare values
fmt.Println()
test := new(big.Int)
fmt.Println((test.Mod(big.NewInt(2015), big.NewInt(2))).Cmp(big.NewInt(1)) == 0)
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https : //play.golang.org/p/TH6UzceZ4y
输出:
a: *big.Int 0x1040a0c0 42
b: *big.Int 0x1040a0d0 42
pointers: false
values: true
true
Run Code Online (Sandbox Code Playgroud)