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
Next revisionBoth sides next revision
rfc:change_the_edge_case_of_round [2023/11/08 15:38] sakirfc:change_the_edge_case_of_round [2023/11/08 16:36] saki
Line 1: Line 1:
 ====== PHP RFC: Change the edge case of round() ====== ====== PHP RFC: Change the edge case of round() ======
-  * Version: 0.4.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
Line 94: Line 94:
 // 1.55 // 1.55
 </code> </code>
 +
 +Ruby behaves the same as current PHP, and Python behaves the same as this RFC aims to do.
  
 ==== Reference: Databases ==== ==== Reference: Databases ====
  
-In most databases, 0.285 and 0.28499999999999998 appear to be distinguishable.+When it comes to databases, there are two types of values: exact values ​​and approximate valuesVerify using approximate values ​​to align with PHP. Since even rounding may occur, I use 1.555, just like in Python.
  
 MySQL: MySQL:
 <code> <code>
-mysql> SELECT ROUND(0.285, 2)+mysql> SELECT 1555E-3 = 15549999999999999E-16
-+-----------------+ ++---------------------------------+ 
-ROUND(0.285, 2) +1555E-3 = 15549999999999999E-16 
-+-----------------+ ++---------------------------------+ 
-           0.29 +                              1 
-+-----------------+++---------------------------------+
  
-mysql> SELECT ROUND(0.28499999999999998, 2); +mysql> SELECT ROUND(1555E-3, 2); 
-+-------------------------------+ ++-------------------+ 
-| ROUND(0.28499999999999998, 2) | +| ROUND(1555E-3, 2) | 
-+-------------------------------+ ++-------------------+ 
-                         0.28 +             1.56 
-+-------------------------------+ ++-------------------+
-</code>+
  
-PostgreSQL: +mysql> SELECT ROUND(15549999999999999E-16, 2); 
-<code> ++---------------------------------+ 
-postgres=# SELECT ROUND(0.285, 2); +ROUND(15549999999999999E-16, 2) | 
- round  ++---------------------------------+ 
-------- +|                            1.56 | 
-  0.29 ++---------------------------------+
- +
-postgres=# SELECT ROUND(0.28499999999999998, 2)+
- round  +
-------- +
-  0.28+
 </code> </code>
  
 SQLite3: SQLite3:
 <code> <code>
-sqlite> SELECT ROUND(0.285, 2); +sqlite> SELECT 1555E-3 = 15549999999999999E-16; 
-0.29 +
- +sqlite> SELECT ROUND(1555E-3, 2); 
-sqlite> SELECT ROUND(0.28499999999999998, 2); +1.56 
-0.29+sqlite> SELECT ROUND(15549999999999999E-16, 2); 
 +1.56
 </code> </code>
  
 Firebird: Firebird:
 <code> <code>
-SQL> SELECT ROUND(0.285, 2) FROM RDB$DATABASE;+SQL> SELECT 1555E-3 FROM RDB$DATABASE;
  
-                ROUND  +               CONSTANT  
-=====================  +=======================  
-                0.290 +1.554999999999999937828 
  
-SQL> SELECT ROUND(0.28499999999999998, 2) FROM RDB$DATABASE;+SQL> SELECT ROUND(1555E-3, 2) FROM RDB$DATABASE;
  
-                ROUND  +                  ROUND  
-=====================  +=======================  
-  0.28000000000000000 +1.560000000000000053291 
 </code> </code>
  
 SqlServer: SqlServer:
 <code> <code>
-1> SELECT ROUND(0.285, 2);+1> SELECT 1555E-3;
 2> go 2> go
-      +                         
------ +------------------------ 
- .290+      1.5549999999999999
  
-1> SELECT ROUND(0.28499999999999998, 2);+1> SELECT ROUND(1555E-3, 2);
 2> go 2> go
-                    +                         
-------------------- +------------------------ 
- .28000000000000000+                    1.55
 </code> </code>
 +
 +MySQL, SQLite, Firebird are similar to current PHP. SqlServer is similar to what this RFC is aiming for.
 +
 +(PostgreSQL requires some effort to round with double precision, and we are currently working on it. I will add it as soon as I can.)
  
 ===== Proposal ===== ===== Proposal =====
Line 174: 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>
  
rfc/change_the_edge_case_of_round.txt · Last modified: 2023/12/08 00:37 by saki