diff --git a/compare/compare.go b/compare/compare.go index 56c5fda..a2a1837 100644 --- a/compare/compare.go +++ b/compare/compare.go @@ -10,6 +10,8 @@ import ( "time" "github.com/duke-git/lancet/v2/convertor" + "github.com/duke-git/lancet/v2/mathutil" + "golang.org/x/exp/constraints" ) // operator type @@ -62,3 +64,8 @@ func LessOrEqual(left, right any) bool { func GreaterOrEqual(left, right any) bool { return compareValue(greaterOrEqual, left, right) } + +// InDelta checks if two values are equal or not within a delta. +func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool { + return float64(mathutil.Abs(left-right)) <= delta +} diff --git a/compare/compare_example_test.go b/compare/compare_example_test.go index 73fbada..055183d 100644 --- a/compare/compare_example_test.go +++ b/compare/compare_example_test.go @@ -168,3 +168,29 @@ func ExampleGreaterOrEqual() { // false // false } + +func ExampleInDelta() { + result1 := InDelta(1, 1, 0) + result2 := InDelta(1, 2, 0) + + result3 := InDelta(2.0/3.0, 0.66667, 0.001) + result4 := InDelta(2.0/3.0, 0.0, 0.001) + + result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0) + result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // false + // true + // false + // false + // true +} diff --git a/compare/compare_test.go b/compare/compare_test.go index c3c1a15..b05c992 100644 --- a/compare/compare_test.go +++ b/compare/compare_test.go @@ -138,3 +138,19 @@ func TestGreaterOrEqual(t *testing.T) { assert.Equal(false, GreaterOrEqual(int64(2), 1)) assert.Equal(false, GreaterOrEqual("b", "c")) } + +func TestInDelta(t *testing.T) { + t.Parallel() + assert := internal.NewAssert(t, "TestInDelta") + + assert.Equal(true, InDelta(1, 1, 0)) + assert.Equal(false, InDelta(1, 2, 0)) + + assert.Equal(true, InDelta(2.0/3.0, 0.66667, 0.001)) + assert.Equal(false, InDelta(2.0/3.0, 0.0, 0.001)) + + assert.Equal(false, InDelta(float64(74.96)-float64(20.48), 54.48, 0)) + assert.Equal(true, InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)) + assert.Equal(false, InDelta(float64(float32(80.45)), float64(80.45), 0)) + assert.Equal(true, InDelta(float64(float32(80.45)), float64(80.45), 1e-5)) +} diff --git a/docs/compare.md b/docs/compare.md index 9b537c5..e88befe 100644 --- a/docs/compare.md +++ b/docs/compare.md @@ -30,6 +30,7 @@ import ( - [GreaterThan](#GreaterThan) - [LessOrEqual](#LessOrEqual) - [GreaterOrEqual](#GreaterOrEqual) +- [InDelta](#InDelta)
@@ -324,3 +325,50 @@ func main() { // false } ``` + +### InDelta + +

Checks if two values are equal or not within a delta.

+ +Signature: + +```go +func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := InDelta(1, 1, 0) + result2 := InDelta(1, 2, 0) + + result3 := InDelta(2.0/3.0, 0.66667, 0.001) + result4 := InDelta(2.0/3.0, 0.0, 0.001) + + result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0) + result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // false + // true + // false + // false + // true +} +```