大整数给我错误的平等结果
big int giving me wrong results in equality
出于某种原因,我在测试相等性时从 big int 得到了错误的结果,即使 mod 结果实际上是正确的!
例如,我想计算 2015%2 结果为 1.
当我使用 big int 时,我这样做时得到 false:
fmt.Println((test.Mod(big.NewInt(2015),big.NewInt(2)))==big.NewInt(1))
然而,当我使用常规 int 时,我得到了 true(无论如何这是正确的):
fmt.Println(2015%2==1)
我是否应该在使用 big int 时以不同的方式处理相等性?
看看 (*int)Cmp 函数。
package main
import (
"fmt"
"math/big"
)
func main() {
a := big.NewInt(5)
b := big.NewInt(5)
fmt.Println(a == b)
fmt.Println(a.Cmp(b))
}
import "math/big"
func NewInt(x int64) *Int
NewInt allocates and returns a new Int set to x.
func (x *Int) Cmp(y *Int) (r int)
Cmp compares x and y and returns:
-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)
}
游乐场:https://play.golang.org/p/TH6UzceZ4y
输出:
a: *big.Int 0x1040a0c0 42
b: *big.Int 0x1040a0d0 42
pointers: false
values: true
true
出于某种原因,我在测试相等性时从 big int 得到了错误的结果,即使 mod 结果实际上是正确的! 例如,我想计算 2015%2 结果为 1.
当我使用 big int 时,我这样做时得到 false:
fmt.Println((test.Mod(big.NewInt(2015),big.NewInt(2)))==big.NewInt(1))
然而,当我使用常规 int 时,我得到了 true(无论如何这是正确的):
fmt.Println(2015%2==1)
我是否应该在使用 big int 时以不同的方式处理相等性?
看看 (*int)Cmp 函数。
package main
import (
"fmt"
"math/big"
)
func main() {
a := big.NewInt(5)
b := big.NewInt(5)
fmt.Println(a == b)
fmt.Println(a.Cmp(b))
}
import "math/big"
func NewInt(x int64) *Int
NewInt allocates and returns a new Int set to x.
func (x *Int) Cmp(y *Int) (r int)
Cmp compares x and y and returns:
-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)
}
游乐场:https://play.golang.org/p/TH6UzceZ4y
输出:
a: *big.Int 0x1040a0c0 42
b: *big.Int 0x1040a0d0 42
pointers: false
values: true
true