123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package dara
- import (
- "math"
- "math/rand"
- "reflect"
- "time"
- )
- // Number is an interface that can be implemented by any numeric type
- type Number interface{}
- // toFloat64 converts a numeric value to float64 for comparison
- func toFloat64(n Number) float64 {
- v := reflect.ValueOf(n)
- switch v.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return float64(v.Int())
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- return float64(v.Uint())
- case reflect.Float32, reflect.Float64:
- return v.Float()
- default:
- panic("unsupported type")
- }
- }
- // Floor returns the largest integer less than or equal to the input number as int
- func Floor(n Number) int {
- v := toFloat64(n)
- floorValue := math.Floor(v)
- return int(floorValue)
- }
- // Round returns the nearest integer to the input number as int
- func Round(n Number) int {
- v := toFloat64(n)
- roundValue := math.Round(v)
- return int(roundValue)
- }
- func Random() float64 {
- rand.Seed(time.Now().UnixNano())
- return rand.Float64()
- }
|