rfc:integer-rounding

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
rfc:integer-rounding [2024/03/09 06:54] – wording maberfc:integer-rounding [2024/03/17 13:38] – In voting phase mabe
Line 3: Line 3:
   * Date: 2023-09-26   * Date: 2023-09-26
   * Author: Marc Bennewitz, php@mabe.berlin   * Author: Marc Bennewitz, php@mabe.berlin
-  * Status: Under Discussion+  * Status: In voting phase
   * First Published at: https://wiki.php.net/RFC/integer-rounding   * First Published at: https://wiki.php.net/RFC/integer-rounding
  
Line 13: Line 13:
 Except ''number_format'' all of these functions take a ''float|int'', do a cast to ''float'', process on floating point number only and finally return a '' float''. Except ''number_format'' all of these functions take a ''float|int'', do a cast to ''float'', process on floating point number only and finally return a '' float''.
  
-As a result of ''round'', ''ceil'' and ''floor'' you get a floating point number rounded to your needs.+As a result of ''round'', ''ceil'' and ''floor'' the resulting value will be a floating point number rounded to your needs.
  
 In most cases this is sufficient but in cases of handling integer values above 2^53 you start to end up with unexpected results due to floating point arithmetic and precision loss. In most cases this is sufficient but in cases of handling integer values above 2^53 you start to end up with unexpected results due to floating point arithmetic and precision loss.
Line 22: Line 22:
 ===== Proposal ===== ===== Proposal =====
  
-This RFC proposes to perform rounding on given int and return the resulting int if possible by default.+This RFC proposes to perform rounding on given int and return a rounded int value if possible by default.
 In case of integer under-/overflow the value will be casted to a float (double) and rounded based on the floating point number as it's done currently. In case of integer under-/overflow the value will be casted to a float (double) and rounded based on the floating point number as it's done currently.
  
 For ''ceil'', ''floor'' and ''round'' with ''precision >= 0'' this means a given int gets returned as is. For ''ceil'', ''floor'' and ''round'' with ''precision >= 0'' this means a given int gets returned as is.
 +----
 +Rounding a given float will perform rounding on floating point number directly and return float as it's done currently.
 +There will be no implicit cast to int because floats (double) can represent a much wider range of numbers than int (32 or 64 bit).
  
 +Floating point numbers on the other hand gets imprecise on representing numbers > 2^53 but passing a float to be rounded such imprecision must be known in first place already.
 +----
 An additional argument will be introduced ''bool force_float''. An additional argument will be introduced ''bool force_float''.
 In PHP 8.next this will default to ''force_float=true'' to keep current behavior but the new behavior can already be used by passing ''force_float=false''. In PHP 8.next this will default to ''force_float=true'' to keep current behavior but the new behavior can already be used by passing ''force_float=false''.
-In PHP 9.0 the default will change to ''force_float=true'' to get the new behavior by default but the previous behavior can be forced with ''force_float=true''.+In PHP 9.0 the default will change to ''force_float=false'' to get the new behavior by default but the previous behavior can be forced with ''force_float=true''.
  
  
Line 68: Line 73:
 var_dump(round(987654321098765432, precision: -3)); var_dump(round(987654321098765432, precision: -3));
 var_dump(round(987654321098765432, precision: -4)); // integer overflow var_dump(round(987654321098765432, precision: -4)); // integer overflow
 +var_dump(round(10000000000000055296)); // input is float
 var_dump(takeFloat(round(987654321098765432, precision: -3))); var_dump(takeFloat(round(987654321098765432, precision: -3)));
 var_dump(returnFloat(round(987654321098765432, precision: -3))); var_dump(returnFloat(round(987654321098765432, precision: -3)));
Line 77: Line 83:
 var_dump(round(987654321098765432, precision: -3, force_float=true)); var_dump(round(987654321098765432, precision: -3, force_float=true));
 var_dump(round(987654321098765432, precision: -4, force_float=true)); // integer overflow var_dump(round(987654321098765432, precision: -4, force_float=true)); // integer overflow
 +var_dump(round(10000000000000055296, force_float=true)); // input is float
 var_dump(takeFloat(round(987654321098765432, precision: -3, force_float=true))); var_dump(takeFloat(round(987654321098765432, precision: -3, force_float=true)));
 var_dump(returnFloat(round(987654321098765432, precision: -3, force_float=true))); var_dump(returnFloat(round(987654321098765432, precision: -3, force_float=true)));
Line 86: Line 93:
 var_dump(round(987654321098765432, precision: -3, force_float=false)); var_dump(round(987654321098765432, precision: -3, force_float=false));
 var_dump(round(987654321098765432, precision: -4, force_float=false)); // integer overflow var_dump(round(987654321098765432, precision: -4, force_float=false)); // integer overflow
 +var_dump(round(10000000000000055296, force_float=false)); // input is float
 var_dump(takeFloat(round(987654321098765432, precision: -3, force_float=false))); var_dump(takeFloat(round(987654321098765432, precision: -3, force_float=false)));
 var_dump(returnFloat(round(987654321098765432, precision: -3, force_float=false))); var_dump(returnFloat(round(987654321098765432, precision: -3, force_float=false)));
Line 96: Line 104:
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 108: Line 117:
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 115: Line 125:
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 122: Line 133:
 int(987654321098765000) int(987654321098765000)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 132: Line 144:
 int(987654321098765000) int(987654321098765000)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 139: Line 152:
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 146: Line 160:
 int(987654321098765000) int(987654321098765000)
 float(9.8765432109877E+17) float(9.8765432109877E+17)
 +float(1.0000000000000055E+19)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
 float(9.87654321098766E+17) float(9.87654321098766E+17)
Line 187: Line 202:
  
  
-===== Proposed Voting Choices ===== +===== Proposed Voting Choices =====  
-One primary vote (requires 2/3 majority): Round on int and return int+As per the voting RFC a yes/no vote with a 2/3 majority is needed for this proposal to be accepted. 
 +Voting started on 2024-03-17 and will end on 2024-04-02 00:00 GMT. 
 +<doodle title="Rounding Integers as int" auth="Marc Bennewitz" voteType="single" closed="false" closeon="2024-04-02T00:00:00Z"> 
 +   * Yes 
 +   * No 
 +</doodle>
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
rfc/integer-rounding.txt · Last modified: 2024/04/02 07:07 by mabe