From e413e026a3949bdf1a83c762bb6d9275aed61f57 Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Tue, 15 Oct 2024 13:10:19 -0400 Subject: [PATCH] Make NestedNumberAsFloat64 accuracy test architecture-neutral. NestedNumberAsFloat64 will convert int64s to float64 only if the int64 value can be represented exactly by a float64. The original test for this property used a roundtrip conversion from int64 to float64 and back, and the behavior of these conversions is inconsistent across architectures. --- .../apimachinery/pkg/apis/meta/v1/unstructured/helpers.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go index 203c325d26c..71f7b163a1c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go @@ -20,6 +20,7 @@ import ( gojson "encoding/json" "fmt" "io" + "math/big" "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -136,10 +137,11 @@ func NestedNumberAsFloat64(obj map[string]interface{}, fields ...string) (float6 } switch x := val.(type) { case int64: - if x != int64(float64(x)) { + f, accuracy := big.NewInt(x).Float64() + if accuracy != big.Exact { return 0, false, fmt.Errorf("%v accessor error: int64 value %v cannot be losslessly converted to float64", jsonPath(fields), x) } - return float64(x), true, nil + return f, true, nil case float64: return x, true, nil default: