BasicOperator.go

package main

import (
	"fmt"
	"math/big"
	"strconv"
)

// add ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func add(vars []string) *big.Float {
	result := big.NewFloat(0)

	for _, varStr := range vars {
		varVal, _, err := big.ParseFloat(varStr, 10, 0, big.ToZero)
		if err != nil {
			varVal = big.NewFloat(0)
		}
		result.Add(result, varVal)
	}

	return result
}

// sub ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λΉΌκΈ° μ—°μ‚°ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func sub(vars []string) *big.Float {
	if len(vars) == 0 {
		return big.NewFloat(0)
	}

	result, _, err := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	if err != nil {
		result = big.NewFloat(0)
	}

	for i := 1; i < len(vars); i++ {
		varVal, _, err := big.ParseFloat(vars[i], 10, 0, big.ToZero)
		if err != nil {
			varVal = big.NewFloat(0)
		}
		result.Sub(result, varVal)
	}

	return result
}

// mul ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ κ³±ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func mul(vars []string) *big.Float {
	if len(vars) == 0 {
		return big.NewFloat(0)
	}

	result, _, err := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	if err != nil {
		result = big.NewFloat(0)
	}

	for i := 1; i < len(vars); i++ {
		varVal, _, err := big.ParseFloat(vars[i], 10, 0, big.ToZero)
		if err != nil {
			varVal = big.NewFloat(0)
		}
		result.Mul(result, varVal)
	}

	return result
}

// div ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λ‚˜λˆˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func div(vars []string) *big.Float {
	if len(vars) == 0 {
		return big.NewFloat(0)
	}

	result, _, err := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	if err != nil {
		result = big.NewFloat(0)
	}

	for i := 1; i < len(vars); i++ {
		varVal, _, err := big.ParseFloat(vars[i], 10, 0, big.ToZero)
		if err != nil {
			varVal = big.NewFloat(0)
		}
		result.Quo(result, varVal)
	}

	return result
}

// preciseAdd ν•¨μˆ˜λŠ” μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func preciseAdd(vars []string, scale int) *big.Float {
	if scale < 0 || scale > 10 {
		scale = 0
	}

	left, _, err1 := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	right, _, err2 := big.ParseFloat(vars[1], 10, 0, big.ToZero)

	if err1 != nil || err2 != nil {
		return big.NewFloat(0)
	}

	result := new(big.Float).Add(left, right)
	result.SetPrec(uint(scale))

	return result
}

// preciseSub ν•¨μˆ˜λŠ” μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λΊ€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func preciseSub(vars []string, scale int) *big.Float {
	if scale < 0 || scale > 10 {
		scale = 0
	}

	left, _, err1 := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	right, _, err2 := big.ParseFloat(vars[1], 10, 0, big.ToZero)

	if err1 != nil || err2 != nil {
		return big.NewFloat(0)
	}

	result := new(big.Float).Sub(left, right)
	result.SetPrec(uint(scale))

	return result
}

// preciseMul ν•¨μˆ˜λŠ” μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ κ³±ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func preciseMul(vars []string, scale int) *big.Float {
	if scale < 0 || scale > 10 {
		scale = 0
	}

	left, _, err1 := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	right, _, err2 := big.ParseFloat(vars[1], 10, 0, big.ToZero)

	if err1 != nil || err2 != nil {
		return big.NewFloat(0)
	}

	result := new(big.Float).Mul(left, right)
	result.SetPrec(uint(scale))

	return result
}

// preciseDiv ν•¨μˆ˜λŠ” μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λ‚˜λˆˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func preciseDiv(vars []string, scale int) *big.Float {
	if scale < 0 || scale > 10 {
		scale = 0
	}

	left, _, err1 := big.ParseFloat(vars[0], 10, 0, big.ToZero)
	right, _, err2 := big.ParseFloat(vars[1], 10, 0, big.ToZero)

	if err1 != nil || err2 != nil {
		return big.NewFloat(0)
	}

	result := new(big.Float).Quo(left, right)
	result.SetPrec(uint(scale))

	return result
}

// scale ν•¨μˆ˜λŠ” μ£Όμ–΄μ§„ κ°’μ˜ μ†Œμˆ˜μ  자리수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
func scale(value string) int {
	varVal, _, err := big.ParseFloat(value, 10, 0, big.ToZero)
	if err != nil {
		return 0
	}
	_, scale := varVal.Float64()
	return scale
}

func main() {
	// 예제 μ‚¬μš©
	nums := []string{"10.5", "5.5", "2"}
	fmt.Println("Add:", add(nums))
	fmt.Println("Sub:", sub(nums))
	fmt.Println("Mul:", mul(nums))
	fmt.Println("Div:", div(nums))

	// Precise operations
	fmt.Println("Precise Add:", preciseAdd([]string{"10.5", "5.5"}, 2))
	fmt.Println("Precise Sub:", preciseSub([]string{"10.5", "5.5"}, 2))
	fmt.Println("Precise Mul:", preciseMul([]string{"10.5", "5.5"}, 2))
	fmt.Println("Precise Div:", preciseDiv([]string{"10.5", "5.5"}, 2))
}

μ„€λͺ…

  • add(vars []string) *big.Float: λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • sub(vars []string) *big.Float: λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λΉΌκΈ° μ—°μ‚°ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • mul(vars []string) *big.Float: λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ κ³±ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • div(vars []string) *big.Float: λ¬Έμžμ—΄ λ°°μ—΄λ‘œ ν‘œν˜„λœ μˆ«μžλ“€μ„ λ‚˜λˆˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • preciseAdd(vars []string, scale int) *big.Float: μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • preciseSub(vars []string, scale int) *big.Float: μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λΊ€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • preciseMul(vars []string, scale int) *big.Float: μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ κ³±ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • preciseDiv(vars []string, scale int) *big.Float: μ§€μ •λœ μ†Œμˆ˜μ  자리수λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ«μžλ“€μ„ λ‚˜λˆˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • scale(value string) int: μ£Όμ–΄μ§„ κ°’μ˜ μ†Œμˆ˜μ  자리수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • main(): 각 ν•¨μˆ˜μ˜ μ‚¬μš© 예제λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ μ„€λͺ…

  1. add ν•¨μˆ˜

    • vars 배열에 μžˆλŠ” λͺ¨λ“  숫자λ₯Ό λ”ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  2. sub ν•¨μˆ˜

    • vars λ°°μ—΄μ˜ 첫 번째 μˆ«μžμ—μ„œ λ‚˜λ¨Έμ§€ μˆ«μžλ“€μ„ μ°¨λ‘€λŒ€λ‘œ λΊ€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  3. mul ν•¨μˆ˜

    • vars 배열에 μžˆλŠ” λͺ¨λ“  숫자λ₯Ό κ³±ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  4. div ν•¨μˆ˜

    • vars λ°°μ—΄μ˜ 첫 번째 숫자λ₯Ό λ‚˜λ¨Έμ§€ μˆ«μžλ“€λ‘œ μ°¨λ‘€λŒ€λ‘œ λ‚˜λˆˆ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  5. preciseAdd ν•¨μˆ˜

    • 두 숫자λ₯Ό λ”ν•˜κ³ , μ§€μ •λœ scale μ •λ°€λ„λ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • scale 값이 0 λ―Έλ§Œμ΄κ±°λ‚˜ 10을 μ΄ˆκ³Όν•˜λ©΄ 0으둜 μ„€μ •ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  6. preciseSub ν•¨μˆ˜

    • 두 숫자λ₯Ό λΉΌκ³ , μ§€μ •λœ scale μ •λ°€λ„λ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • scale 값이 0 λ―Έλ§Œμ΄κ±°λ‚˜ 10을 μ΄ˆκ³Όν•˜λ©΄ 0으둜 μ„€μ •ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  7. preciseMul ν•¨μˆ˜

    • 두 숫자λ₯Ό κ³±ν•˜κ³ , μ§€μ •λœ scale μ •λ°€λ„λ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • scale 값이 0 λ―Έλ§Œμ΄κ±°λ‚˜ 10을 μ΄ˆκ³Όν•˜λ©΄ 0으둜 μ„€μ •ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  8. preciseDiv ν•¨μˆ˜

    • 두 숫자λ₯Ό λ‚˜λˆ„κ³ , μ§€μ •λœ scale μ •λ°€λ„λ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • scale 값이 0 λ―Έλ§Œμ΄κ±°λ‚˜ 10을 μ΄ˆκ³Όν•˜λ©΄ 0으둜 μ„€μ •ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

    • λ³€ν™˜ 쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  9. scale ν•¨μˆ˜

    • μ£Όμ–΄μ§„ 숫자의 μ†Œμˆ˜μ  자릿수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    • big.ParseFloatλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ *big.Float둜 λ³€ν™˜ν•˜κ³  μ†Œμˆ˜μ  자릿수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

main ν•¨μˆ˜

  • λ‹€μ–‘ν•œ μˆ˜ν•™ μ—°μ‚°μ˜ 예제 μ‚¬μš©μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

  • 각 ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

Last updated