Skip to content

Commit 56a032c

Browse files
authored
Fix float precision loss in jsonschema ParseFloat (#4992)
## Changes - Fix `ParseFloat` to use 64-bit precision instead of 32-bit, which caused silent precision loss for float values in `bundle init` template prompts (e.g., `1.1` became `1.100000023841858`). ## Tests - Updated unit test to use exact float comparison, verifying the precision fix.
1 parent d58d93a commit 56a032c

7 files changed

Lines changed: 30 additions & 4 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"properties": {
3+
"n": {
4+
"type": "number",
5+
"description": "A number variable",
6+
"default": 1.1
7+
}
8+
}
9+
}

acceptance/bundle/templates-machinery/number-precision/out.test.toml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
>>> [CLI] bundle init .
3+
✨ Successfully initialized template
4+
5+
>>> cat number.txt
6+
n: 1.1
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
trace $CLI bundle init .
2+
3+
trace cat number.txt
4+
rm number.txt
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
n: {{ .n }}

libs/jsonschema/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func fromString(s string, T Type) (any, error) {
110110
case BooleanType:
111111
v, err = strconv.ParseBool(s)
112112
case NumberType:
113-
v, err = strconv.ParseFloat(s, 32)
113+
v, err = strconv.ParseFloat(s, 64)
114114
case IntegerType:
115115
v, err = strconv.ParseInt(s, 10, 64)
116116
case ArrayType, ObjectType:

libs/jsonschema/utils_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,17 @@ func TestTemplateFromString(t *testing.T) {
9595

9696
v, err = fromString("1.1", NumberType)
9797
assert.NoError(t, err)
98-
// Floating point conversions are not perfect
99-
assert.Less(t, (v.(float64) - 1.1), 0.000001)
98+
//nolint:testifylint // exact float64 equality is the property under test
99+
assert.Equal(t, 1.1, v)
100100

101101
v, err = fromString("12345", IntegerType)
102102
assert.NoError(t, err)
103103
assert.Equal(t, int64(12345), v)
104104

105105
v, err = fromString("123", NumberType)
106106
assert.NoError(t, err)
107-
assert.InDelta(t, float64(123), v.(float64), 0.0001)
107+
//nolint:testifylint // exact float64 equality is the property under test
108+
assert.Equal(t, float64(123), v)
108109

109110
_, err = fromString("qrt", ArrayType)
110111
assert.EqualError(t, err, "cannot parse string as object of type array. Value of string: \"qrt\"")

0 commit comments

Comments
 (0)