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 revisionBoth sides next revision
rfc:change_the_edge_case_of_round [2023/11/08 16:03] 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 =====
rfc/change_the_edge_case_of_round.txt · Last modified: 2023/12/08 00:37 by saki