On Tue, Aug 26, 2025, at 20:23, Tim Düsterhus wrote: > Hi > > On 8/26/25 19:14, Alexandre Daubois wrote: > >> 3.14 is not exactly representable as a IEEE-754 double-precision > >> floating point number. The two nearest representable values are > >> 3.14000000000000012434 (this one is the nearest) and > >> 3.13999999999999968026. Returning `true` for > >> `is_representable_as_float("3.14")` is therefore wrong to me. > > > > You're right about mathematical precision. Perhaps the function name > > is misleading. What the function actually should check is whether a > > string > float > string roundtrip preserves the value as PHP > > developers would expect it, not whether it's mathematically exactly > > representable in IEEE-754. > > > > Maybe a more accurate name would better reflect this behavior. Naming > > is super hard again here. The goal is pragmatic: "will this value > > survive a type conversion cycle without surprising changes?" > > "Surprising changes" is not a meaningful term. Keep in mind that the > behavior of the function will need to be accurately documented and that > folks need something to work with to determine whether a report is valid > or not when bugs in the function get reported - which will inevitably > happen. > > In fact to use one of the examples for the RFC: 1e10 does not roundtrip. > > php > var_dump((string)(float)"1e10"); > string(11) "10000000000" > > "1e10" clearly is different than "10000000000". > > Generally speaking, I'm also not sure if “printing raw floats” is a > use-case we should encourage. Instead almost any application will need > to format a number for a specific use-case. Formatting numbers for human > consumption [1] has different requirements compared to formatting > numbers for programmatic consumption.
Indeed. In some parts of the world, 1.000,01 is interpreted as 1000.01 in computers. That format also doesn’t roundtrip but is a valid numeric string, depending on locale. — Rob