如何在Go语言中比较两个MongoDB原始类型Decimal128?

huangapple go评论116阅读模式
英文:

How to compare two Mongodb primitive type Decimal128 in go

问题

如何计算 valueA < valueB?

要比较两个 Decimal128 类型的值 valueA 和 valueB 的大小,可以使用以下方法:

  1. if valueA.LessThan(valueB) {
  2. // valueA 小于 valueB
  3. } else {
  4. // valueA 大于等于 valueB
  5. }

在这个例子中,valueA.LessThan(valueB) 方法用于判断 valueA 是否小于 valueB。如果返回 true,则表示 valueA 小于 valueB;如果返回 false,则表示 valueA 大于等于 valueB。

英文:
  1. valueA, _ := primitive.ParseDecimal128(&quot;123.00&quot;)
  2. valueB, _ := primitive.ParseDecimal128(&quot;123.12&quot;)

how to calculate valueA < valueB?

答案1

得分: 3

我找到了一个答案,感谢@Matteo。

有一个函数可以将Decimal128转换为BigInt,并且可以使用BigInt进行比较。

  1. func CompareDecimal128(d1, d2 primitive.Decimal128) (int, error) {
  2. b1, exp1, err := d1.BigInt()
  3. if err != nil {
  4. return 0, err
  5. }
  6. b2, exp2, err := d2.BigInt()
  7. if err != nil {
  8. return 0, err
  9. }
  10. sign := b1.Sign()
  11. if sign != b2.Sign() {
  12. if b1.Sign() > 0 {
  13. return 1, nil
  14. } else {
  15. return -1, nil
  16. }
  17. }
  18. if exp1 == exp2 {
  19. return b1.Cmp(b2), nil
  20. }
  21. if sign < 0 {
  22. if exp1 < exp2 {
  23. return 1, nil
  24. }
  25. return -1, nil
  26. } else {
  27. if exp1 < exp2 {
  28. return -1, nil
  29. }
  30. return 1, nil
  31. }
  32. }

*已编辑指数部分

英文:

I found an answer thanks to @Matteo

There is a function converting Decimal128 to BigInt.

and BigInt available to compare

  1. func CompareDecimal128(d1, d2 primitive.Decimal128) (int, error) {
  2. b1, exp1, err := d1.BigInt()
  3. if err != nil {
  4. return 0, err
  5. }
  6. b2, exp2, err := d2.BigInt()
  7. if err != nil {
  8. return 0, err
  9. }
  10. sign := b1.Sign()
  11. if sign != b2.Sign() {
  12. if b1.Sign() &gt; 0 {
  13. return 1, nil
  14. } else {
  15. return -1, nil
  16. }
  17. }
  18. if exp1 == exp2 {
  19. return b1.Cmp(b2), nil
  20. }
  21. if sign &lt; 0 {
  22. if exp1 &lt; exp2 {
  23. return 1, nil
  24. }
  25. return -1, nil
  26. } else {
  27. if exp1 &lt; exp2 {
  28. return -1, nil
  29. }
  30. return 1, nil
  31. }
  32. }

*edited for exponential part

答案2

得分: 1

在这个测试中查找:

  1. func compareDecimal128(d1, d2 primitive.Decimal128) bool {
  2. d1H, d1L := d1.GetBytes()
  3. d2H, d2L := d2.GetBytes()
  4. if d1H != d2H {
  5. return false
  6. }
  7. if d1L != d2L {
  8. return false
  9. }
  10. return true
  11. }

这里

英文:

Looking in the test here:

  1. func compareDecimal128(d1, d2 primitive.Decimal128) bool {
  2. d1H, d1L := d1.GetBytes()
  3. d2H, d2L := d2.GetBytes()
  4. if d1H != d2H {
  5. return false
  6. }
  7. if d1L != d2L {
  8. return false
  9. }
  10. return true
  11. }

huangapple
  • 本文由 发表于 2021年12月24日 14:33:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/70470194.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定