1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* go get github.com/shopspring/decimal 10進数 goの任意精度の固定小数点10進数。 注:10進ライブラリーは、小数点以下2 ^ 31桁の数値のみを表すことができます。 特徴 ゼロ値は0であり、初期化せずに安全に使用できます 精度を損なうことなく加算、減算、乗算 指定された精度での除算 データベース/ SQLのシリアル化/逆シリアル化 JSONおよびXMLのシリアル化/逆シリアル化 by google translate */ package main import ( "fmt" "math" "github.com/shopspring/decimal" ) func main() { fmt.Println(1100.0 * 0.10 / 1.10) // 100 fmt.Println(int64(math.Floor(float64(1100) * 0.10 / (1 + 0.10)))) // 99 amount := decimal.NewFromInt(1100) tax := decimal.NewFromFloat(0.10) a := amount.Mul(tax).Div(decimal.NewFromFloat(1).Add(tax)) f64, ok := a.Float64() if !ok { fmt.Println("failed") } fmt.Println("amount", a, f64) // amount 100 100 fmt.Println(decimal.NewFromFloat(3.14).Round(0)) // 3 fmt.Println(decimal.NewFromFloat(3.15).DivRound(decimal.NewFromFloat(1), 0)) // 3 fmt.Println(decimal.NewFromFloat(3.45).DivRound(decimal.NewFromFloat(1), 0)) // 3 fmt.Println(decimal.NewFromFloat(3.50).DivRound(decimal.NewFromFloat(1), 0)) // 4 fmt.Println(decimal.NewFromFloat(3.65).DivRound(decimal.NewFromFloat(1), 0)) // 4 i := 0.9 fmt.Println(decimal.NewFromFloat(3.09).DivRound(decimal.NewFromFloat(i), 0)) // 3 fmt.Println(decimal.NewFromFloat(3.40).DivRound(decimal.NewFromFloat(i), 0)) // 4 fmt.Println(decimal.NewFromFloat(3.50).DivRound(decimal.NewFromFloat(i), 0)) // 4 fmt.Println(decimal.NewFromFloat(3.65).DivRound(decimal.NewFromFloat(i), 0)) // 4 } |