Compare commits

...

7 Commits

Author SHA1 Message Date
dtapps cb4c11ed29 update
5 months ago
李光春 537950e68f - update
2 years ago
李光春 3077d5fe77 - update
2 years ago
李光春 47ed2dee63 - add IsInteger
2 years ago
李光春 d876f75d9f - add IsInteger
2 years ago
李光春 56bdfc6a73 - 增加输出float64带小数点(自适应)
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 e3724e56fe - add Float64Point
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago

4
.gitignore vendored

@ -4,6 +4,6 @@
.idea
.vscode
*.log
goinit.sh
gomod.sh
/vendor/
/vendor/
*_test.go

@ -12,8 +12,8 @@
#### 安装
```go
go get -v -u go.dtapp.net/godecimal
```shell
go get -v -u go.dtapp.net/godecimal@v1.0.11
```
#### 使用

@ -1,5 +1,14 @@
package godecimal
import "fmt"
// NewInterface 创建
func NewInterface(value interface{}) Decimal {
d := New()
d.floatValue.SetString(fmt.Sprint(value))
return d
}
// NewString 从字符串创建
func NewString(s string) Decimal {
d := New()

@ -1,7 +1,10 @@
package godecimal
import (
"fmt"
"math"
"math/big"
"strings"
)
// String 输出 string
@ -9,6 +12,12 @@ func (d Decimal) String() string {
return d.floatValue.String()
}
// Int64 输出 int64
func (d Decimal) Int64() int64 {
i64, _ := d.floatValue.Int64()
return i64
}
// Float64 输出 float64
func (d Decimal) Float64() float64 {
rat, _ := new(big.Rat).SetString(d.String())
@ -23,9 +32,50 @@ func (d Decimal) MoneyFloat64() float64 {
return f
}
// MoneyPoint 输出 float64带小数点
func (d Decimal) MoneyPoint(p int) float64 {
// Float64Point 输出float64带小数点
func (d Decimal) Float64Point(p int) float64 {
rat, _ := new(big.Rat).SetString(d.floatValue.Text('f', p))
f, _ := rat.Float64()
return f
}
// Float64PointAdaptive 输出float64带小数点(自适应)
func (d Decimal) Float64PointAdaptive(maxP int) float64 {
f, _ := d.floatValue.Float64()
if maxP > 0 {
pL := d.pointLength(f)
if pL > maxP {
rat, _ := new(big.Rat).SetString(d.floatValue.Text('f', maxP))
f2, _ := rat.Float64()
return f2
} else {
return f
}
} else {
return f
}
}
func (Decimal) pointLength(a any) int {
tmp := strings.Split(fmt.Sprint(a), ".")
if len(tmp) <= 1 {
return 0
}
return len(tmp[1])
}
// IsInteger 是否为整数
func (d Decimal) IsInteger(d2 float64) bool {
if d2 > 0 {
f3 := NewFloat(d.Float64()).QuoFloat(NewFloat(d2).Float64()).Float64()
if f3 == math.Trunc(f3) {
return true
}
return false
}
f3 := NewFloat(d.Float64()).Float64()
if f3 == math.Trunc(f3) {
return true
}
return false
}

@ -1,66 +0,0 @@
package godecimal
import (
"math/big"
"reflect"
"testing"
)
func TestNew(t *testing.T) {
priceString := NewString("100")
t.Log("从字符串创建:", priceString)
priceFloat := NewFloat(0.20)
t.Log("从浮点数创建:", priceFloat)
priceInt := NewInt(300)
t.Log("从整数创建:", priceInt)
priceUint := NewUint(400)
t.Log("从无符合整数创建:", priceUint)
t.Log("加:", priceString.Add(priceFloat), reflect.TypeOf(priceString))
t.Log("减", priceString.Sub(priceFloat), reflect.TypeOf(priceString))
t.Log("乘:", priceString.Mul(priceFloat), reflect.TypeOf(priceString))
t.Log("除:", priceString.Quo(priceFloat), reflect.TypeOf(priceString))
}
// https://www.itranslater.com/qa/details/2582643503239005184
// https://stackoverflow.com/questions/18390266/how-can-we-truncate-float64-type-to-a-particular-precision
func TestOperation(t *testing.T) {
a1 := NewFloat(0.1890)
t.Log("a1", a1)
a2 := NewFloat(0.50)
t.Log("a2", a2)
t.Log("a1+a2", a1.Add(a2), a1.Add(a2).String(), a1.Add(a2).Float64(), reflect.TypeOf(a1.Add(a2).Float64()), a1.Add(a2).MoneyFloat64(), reflect.TypeOf(a1.Add(a2).MoneyFloat64()))
t.Log("a1-a2", a1.Sub(a2), a1.Sub(a2).String(), a1.Sub(a2).Float64(), reflect.TypeOf(a1.Sub(a2).Float64()), a1.Sub(a2).MoneyFloat64(), reflect.TypeOf(a1.Sub(a2).MoneyFloat64()))
t.Log("a1*a2", a1.Mul(a2), a1.Mul(a2).String(), a1.Mul(a2).Float64(), reflect.TypeOf(a1.Mul(a2).Float64()), a1.Mul(a2).MoneyFloat64(), reflect.TypeOf(a1.Mul(a2).MoneyFloat64()))
t.Log("a1/a2", a1.Quo(a2), a1.Quo(a2).String(), a1.Quo(a2).Float64(), reflect.TypeOf(a1.Quo(a2).Float64()), a1.Quo(a2).MoneyFloat64(), reflect.TypeOf(a1.Quo(a2).MoneyFloat64()))
a3 := NewFloat(.035)
t.Log("a3", a3)
a4 := NewFloat(.08875)
t.Log("a4", a4)
t.Log("a3+a4", a3.Add(a4), a3.Add(a4).String(), a3.Add(a4).Float64(), reflect.TypeOf(a3.Add(a4).Float64()), a3.Add(a4).MoneyFloat64(), reflect.TypeOf(a3.Add(a4).MoneyFloat64()))
t.Log("a3-a4", a3.Sub(a4), a3.Sub(a4).String(), a3.Sub(a4).Float64(), reflect.TypeOf(a3.Sub(a4).Float64()), a3.Sub(a4).MoneyFloat64(), reflect.TypeOf(a3.Sub(a4).MoneyFloat64()))
t.Log("a3*a4", a3.Mul(a4), a3.Mul(a4).String(), a3.Mul(a4).Float64(), reflect.TypeOf(a3.Mul(a4).Float64()), a3.Mul(a4).MoneyFloat64(), reflect.TypeOf(a3.Mul(a4).MoneyFloat64()))
t.Log("a3/a4", a3.Quo(a4), a3.Quo(a4).String(), a3.Quo(a4).Float64(), reflect.TypeOf(a3.Quo(a4).Float64()), a3.Quo(a4).MoneyFloat64(), reflect.TypeOf(a3.Quo(a4).MoneyFloat64()))
}
func Test3(t *testing.T) {
var x1, y1 float64 = 10, 3
z1 := x1 / y1
t.Log(x1, y1, z1)
x2, y2 := big.NewFloat(10), big.NewFloat(3)
z2 := new(big.Float).Quo(x2, y2)
t.Log(x2, y2, z2)
}

@ -1,13 +0,0 @@
package godecimal
import (
"reflect"
"testing"
)
func TestCalculation(t *testing.T) {
t.Log("加:", Float64Add(10, 3), reflect.TypeOf(Float64Add(10, 3)))
t.Log("减", Float64Sub(10, 3), reflect.TypeOf(Float64Sub(10, 3)))
t.Log("乘:", Float64Mul(10, 3), reflect.TypeOf(Float64Mul(10, 3)))
t.Log("除:", Float64Quo(10, 3), reflect.TypeOf(Float64Quo(10, 3)))
}

@ -1,3 +1,3 @@
module go.dtapp.net/godecimal
go 1.19
go 1.21

@ -0,0 +1,35 @@
package godecimal
import (
"database/sql/driver"
"fmt"
"strings"
)
type DFloat struct {
FValue float64
Point int
}
// Value 实现 driver.Valuer 接口Value 返回 json value
func (f DFloat) Value() (driver.Value, error) {
return NewFloat(f.FValue).Float64PointAdaptive(f.Point), nil
}
// Scan 方法实现了 sql.Scanner 接口
func (f *DFloat) Scan(value interface{}) error {
f1, _ := value.(float64)
*f = DFloat{
FValue: f1,
Point: pointLength(f1),
}
return nil
}
func pointLength(a any) int {
tmp := strings.Split(fmt.Sprint(a), ".")
if len(tmp) <= 1 {
return 0
}
return len(tmp[1])
}

@ -1,26 +0,0 @@
package godecimal
import "testing"
func TestMath(t *testing.T) {
t.Log(Abs(111))
t.Log(Abs(-111))
t.Log(Floor(3.4))
t.Log(Floor(3.5))
t.Log(Ceil(3.4))
t.Log(Ceil(3.5))
t.Log(Round(3.4))
t.Log(Round(3.5))
t.Log(RoundPoint(3.4))
t.Log(RoundPoint(3.5))
t.Log(RoundPoint(3.14))
t.Log(RoundPoint(3.14159))
t.Log(Max(4, 3))
t.Log(Min(4, 3))
}

@ -1,3 +1,3 @@
package godecimal
const Version = "1.0.5"
const Version = "1.0.11"

@ -1,7 +0,0 @@
package godecimal
import "testing"
func TestVersion(t *testing.T) {
t.Log(Version)
}
Loading…
Cancel
Save