Compare commits

...

5 Commits

@ -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()

@ -2,6 +2,7 @@ package godecimal
import (
"fmt"
"math"
"math/big"
"strings"
)
@ -11,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())
@ -36,8 +43,8 @@ func (d Decimal) Float64Point(p int) float64 {
func (d Decimal) Float64PointAdaptive(maxP int) float64 {
f, _ := d.floatValue.Float64()
if maxP > 0 {
pointLength := d.pointLength(f)
if pointLength > maxP {
pL := d.pointLength(f)
if pL > maxP {
rat, _ := new(big.Rat).SetString(d.floatValue.Text('f', maxP))
f2, _ := rat.Float64()
return f2
@ -56,3 +63,19 @@ func (Decimal) pointLength(a any) int {
}
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,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,3 +1,3 @@
package godecimal
const Version = "1.0.7"
const Version = "1.0.11"

Loading…
Cancel
Save