rfc:change_the_edge_case_of_round

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
rfc:change_the_edge_case_of_round [2023/11/08 14:06] sakirfc:change_the_edge_case_of_round [2023/12/08 00:37] (current) saki
Line 1: Line 1:
 ====== PHP RFC: Change the edge case of round() ====== ====== PHP RFC: Change the edge case of round() ======
-  * Version: 0.3.0+  * Version: 0.4.1
   * Date: 2023-10-23   * Date: 2023-10-23
   * Author: Saki Takamachi, saki@sakiot.com   * Author: Saki Takamachi, saki@sakiot.com
-  * Status: Under Discussion+  * Status: Declined
   * First Published at: https://wiki.php.net/rfc/change_the_edge_case_of_round   * First Published at: https://wiki.php.net/rfc/change_the_edge_case_of_round
  
Line 73: Line 73:
 ==== Reference: For other languages ==== ==== Reference: For other languages ====
  
-Ruby is similar to modern PHP. Rounding 0.285 gives you 0.29.+Similar to PHP, we investigated languages ​​that allow you to specify the precision you want to round.
  
-Python rounds is even round, so 0.285 will always be 0.28 regardless of edge cases. Howeverif you test with 0.295, which behaves similarly to 0.285it will be rounded to 0.29so the edge case determination is the same as "if this RFC is passed".+Ruby: 
 +<code> 
 +p 0.285.round(2) 
 +// 0.29 
 + 
 +p 0.28499999999999998.round(2) 
 +// 0.29 
 +</code> 
 + 
 +Python: 
 +<code> 
 +// Python rounds to even numbers, so 0.285 cannot be comparedInsteadI use 1.555, which is also 1.5549... due to the FP error. 
 + 
 +print(round(1.5552)) 
 +// 1.55 
 + 
 +print(round(1.55499999999999992)) 
 +// 1.55 
 +</code> 
 + 
 +Ruby behaves the same as current PHP, and Python behaves the same as this RFC aims to do. 
 + 
 +==== Reference: Databases ==== 
 + 
 +When it comes to databases, there are two types of values: exact values ​​and approximate values. Verify using approximate values ​​to align with PHP. Since even rounding may occur, I use 1.555, just like in Python. 
 + 
 +MySQL: 
 +<code> 
 +mysql> SELECT 1555E-3 = 15549999999999999E-16; 
 ++---------------------------------+ 
 +| 1555E-3 = 15549999999999999E-16 | 
 ++---------------------------------+ 
 +|                               1 | 
 ++---------------------------------+ 
 + 
 +mysql> SELECT ROUND(1555E-3, 2); 
 ++-------------------+ 
 +| ROUND(1555E-3, 2) | 
 ++-------------------+ 
 +|              1.56 | 
 ++-------------------+ 
 + 
 +mysql> SELECT ROUND(15549999999999999E-16, 2); 
 ++---------------------------------+ 
 +| ROUND(15549999999999999E-16, 2) | 
 ++---------------------------------+ 
 +|                            1.56 | 
 ++---------------------------------+ 
 +</code> 
 + 
 +SQLite3: 
 +<code> 
 +sqlite> SELECT 1555E-3 = 15549999999999999E-16; 
 +
 +sqlite> SELECT ROUND(1555E-3, 2); 
 +1.56 
 +sqlite> SELECT ROUND(15549999999999999E-16, 2); 
 +1.56 
 +</code> 
 + 
 +Firebird: 
 +<code> 
 +SQL> SELECT 1555E-3 FROM RDB$DATABASE; 
 + 
 +               CONSTANT  
 +=======================  
 +1.554999999999999937828  
 + 
 +SQL> SELECT ROUND(1555E-3, 2) FROM RDB$DATABASE; 
 + 
 +                  ROUND  
 +=======================  
 +1.560000000000000053291  
 +</code> 
 + 
 +SqlServer: 
 +<code> 
 +1> SELECT 1555E-3; 
 +2> go 
 +                         
 +------------------------ 
 +      1.5549999999999999 
 + 
 +1> SELECT ROUND(1555E-3, 2); 
 +2> go 
 +                         
 +------------------------ 
 +                    1.55 
 +</code> 
 + 
 +MySQL, SQLite, Firebird are similar to current PHP. SqlServer is similar to what this RFC is aiming for. 
 + 
 +PostgreSQL cannot round double precision values ​​if we specify digits, so omit it.
  
 ===== Proposal ===== ===== Proposal =====
Line 83: Line 175:
 // previous behavior // previous behavior
 var_dump(round(0.285, 2)); // float(0.29) var_dump(round(0.285, 2)); // float(0.29)
 +var_dump(round(0.28499999999999998, 2)); // float(0.29)
  
 // new behavior // new behavior
 var_dump(round(0.285, 2)); // float(0.28) var_dump(round(0.285, 2)); // float(0.28)
 +var_dump(round(0.28499999999999998, 2)); // float(0.28)
 </code> </code>
  
Line 120: Line 214:
  
 ===== Proposed Voting Choices ===== ===== Proposed Voting Choices =====
-We will probably vote for or against adding these functions. This requires 2/3 majority.+ 
 +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 2023-11-24 and will end on 2023-12-08 00:00 GMT. 
 +<doodle title="Change the edge case of round()" auth="Saki Takamachi" voteType="single" closed="false" closeon="2023-12-08T00:00:00Z"> 
 +   * Yes 
 +   * No 
 +</doodle>
  
 ===== Implementation ===== ===== Implementation =====
rfc/change_the_edge_case_of_round.1699452383.txt.gz · Last modified: 2023/11/08 14:06 by saki