본문 바로가기
Go

[Go] The Error of Floating Point Number

by llHoYall 2021. 10. 4.

Like most programming languages, Go also has the floating point error problem.

Problem

Please look at the below code.

package main

import (
  "fmt"
)

func main() {
  a := 0.1
  b := 0.2
  c := a + b
  fmt.Println(c)
}
// 0.30000000000000004

c was not a 0.3!

Therefore, we are hard to compare floating point numbers.

a := 0.1
b := 0.2
c := 0.3
d := a + b
if c == d {
  fmt.Println("It's the same!")
} else {
  fmt.Println("It's different!")
}
// It's different!

Them, how can we achieve this?

There are two possible solutions.

Solution1: math.Nextafter()

math package has Nextafter() function.

func Nextafter(x, y float64) (r float64)

Nextafter() function returns the next representable float64 value after x towards y.

if math.Nextafter(c, d) == d {
  fmt.Println("It's the same!")
} else {
  fmt.Println("It's different!")
}
// It's the same!

Solution2: math/big

math package has the big package and it can handle floating point numbers precisely.

a, _ := new(big.Float).SetString("0.1")
b, _ := new(big.Float).SetString("0.2")
c, _ := new(big.Float).SetString("0.3")
d := new(big.Float).Add(a, b)
if c.Cmp(d) == 0 {
  fmt.Println("It's the same!")
} else {
  fmt.Println("It's different!")
}
// It's the same!

It's a little complex but if you handle a financial program, you'd like to use this package.

'Go' 카테고리의 다른 글

[Go] Control Flow  (0) 2021.10.10
[Go] Constant  (0) 2021.10.05
[Go] Operator  (0) 2021.10.04
[Go] File handling  (0) 2020.12.02
[Go] Configure VSCode  (0) 2020.11.28

댓글