Short answer:
Use type double instead of float, i.e. javacast("double", value)
Longer answer:
The Cell.setCellValue() method actually expects type Double (not Float). Double is also what CF uses for most numeric operations and functions . When you pass a Float into those methods, it is implicitly converted into a Double. That conversion is (indirectly) causing the unexpected result.
The reason is that both Float and Double are approximate types. However, Double has greater precision:
float: The float data type is a single-precision 32-bit IEEE 754 floating point. ...
double: The double data type is a double-precision 64-bit IEEE 754 floating point. ...
So as this thread points out (emphasis mine):
It's not that you're actually getting extra precision - it's that the
float didn't accurately represent the number you were aiming for
originally. The double is representing the original float accurately;
toString is showing the "extra" data which was already present.
... [When converted to a double, it] will have exactly the same value, but when you convert it to a string it will "trust" that it's accurate to a higher precision, so won't round off as early, and you'll see the "extra digits" which were already there, but hidden from you
That is why both "601761.66" and "601761.6875" seem to be rounded to "601761.7" when cast as a float, but are displayed expected when cast as a double.
<cfscript>
value1 = "601761.66";
value2 = "601761.6875";
WriteOutput("<br>[Float] "& value1 &" = "& javacast("float", value1));
WriteOutput("<br>[Float] "& value2 &" = "& javacast("float", value2));
WriteOutput("<br>[Float=>Double] "& value1 &" = "& javacast("double", javacast("float", value1)));
WriteOutput("<br>[Double] "& value1 &" = "& javacast("double", value1));
WriteOutput("<br>[Double] "& value2 &" = "& javacast("double", value2));
</cfscript>
Output:
[Float] 601761.66 = 601761.7
[Float] 601761.6875 = 601761.7
[Float=>Double] 601761.66 = 601761.6875
[Double] 601761.66 = 601761.66
[Double] 601761.6875 = 601761.6875
NB: CF uses Float.toString() and Double.ToString() to display the values via cfoutput/writeOutput/cfdump.