But Lua has no programmatic way to specify that a number whose value is an integer must be treated as an integer or as a float
(both have typeof == "number")
. Integers are just internal optimisations for the fast path. With the same exposed type, you would not be able to compute the price per liter of a box containing exactly 2 liters of cream and costing exactly 5 dollars: if you display 2 $/L, your price is wrong when the effective cost is 2.50 $/L.
So:
- either we have separate datatypes (instead of just internal subtypes): this is what you do in C, C++, Java...
- or we need separate operations (operators or functions): this is what you do in Lua, PHP, _javascript_ and in classic mathematics with an unified number type...
- or we need to specify an operating mode to specify the semantics : this is the worst, the least manageable as this makes the code highly dependant on context (including in subfunctions that would not be aware and would be expected to be called and have been tested only from one mode): this is similar to the IEEE rounding modes, difficult to track and isolate in C/C++, and banned in Java, or being effective only in the local scope (creating difficulties when the code is refactored with subfunctions).
This problem is not solvable without one of these choices.
The safest solution IMHO is to have separate operations, so "/" should not enforce the integer-only arithmetic and should preserve the maximum precision supported for ALL valid number values.