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 09:36] 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 70: Line 70:
  
 It can be seen that PHP's policy is not to require FP to behave as a decimal number. And as it says in the warning, if we want to calculate as a decimal number, we should use BCMath. It can be seen that PHP's policy is not to require FP to behave as a decimal number. And as it says in the warning, if we want to calculate as a decimal number, we should use BCMath.
 +
 +==== Reference: For other languages ====
 +
 +Similar to PHP, we investigated languages ​​that allow you to specify the precision you want to round.
 +
 +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 compared. Instead, I use 1.555, which is also 1.5549... due to the FP error.
 +
 +print(round(1.555, 2))
 +// 1.55
 +
 +print(round(1.5549999999999999, 2))
 +// 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;
 +1
 +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 77: 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 114: 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.1699436207.txt.gz · Last modified: 2023/11/08 09:36 by saki