Technically it isn't populating the "wrong" value, just not the one you were expecting. The problem is with the variables you're using in the formula.
Any repeatable value, like fields in tables or collections, is multivalued so when you use the variable in a formula that would be referencing all of the values.
If you want a row-by-row calculation, you need to tell the formula which value to use, and you do that with the INDEX function.
Forms also has a ROW() function which will return the index of the "current" row, which you would combine with the index to reference the corresponding values from the row.
For example, in the following formula
=PRODUCT(1.5,7.48,basin_storage.basin_1_cubic_feet)
If "basin_storage.basin_1_cubic_feet" is a column in the same row, you would need to instead use the following
=PRODUCT(1.5,7.48,INDEX(basin_storage.basin_1_cubic_feet,ROW()))
The syntax is INDEX([variable],[index])
Inside a table/collection, ROW() provides the "current" row index, so you get
INDEX([variable],ROW())
If you need to reference multiple columns/variables from the row, you need to wrap each variable in its own separate INDEX function like so
PRODUCT(INDEX(table.column1,ROW()),INDEX(table.column2,ROW()))