ArithmeticOperator.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))
}설명
함수 설명
코드 개선 사항
Last updated