php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #79338 fmod() not calculating properly
Submitted: 2020-03-03 11:20 UTC Modified: 2020-03-03 17:43 UTC
From: ziggi at ziggi dot pl Assigned:
Status: Not a bug Package: *Math Functions
PHP Version: 7.4.3 OS: Windows
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: ziggi at ziggi dot pl
New email:
PHP Version: OS:

 

 [2020-03-03 11:20 UTC] ziggi at ziggi dot pl
Description:
------------
---
From manual page: https://php.net/function.fmod
---

I would say - simple answer provided by PHP team:

"The value that you expect (0) is obtained using float precision. (In C)
PHP uses double, and with this type fmod() returns 1.3."

I completely pointless. This is not math! This is plain bullshit!!!

Perl, MySQL, Python... you name it, all have no problems!!!

Test script:
---------------
echo fmod(75.6, 25.2);

Expected result:
----------------
0

Actual result:
--------------
25.2

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-03-03 11:35 UTC] nikic@php.net
-Status: Open +Status: Not a bug
 [2020-03-03 11:35 UTC] nikic@php.net
> cat test.c
#include <math.h>
#include <stdio.h>
int main() {
    printf("%f\n", fmod(75.6, 25.2));
    return 0;
}

> gcc test.c -lm
> ./a.out 
25.200000
 [2020-03-03 11:38 UTC] cmb@php.net
Also note:

<?php
$num = 75.6;
$denom = 25.2;
$res = fmod($num, $denom);
var_dump($res === $denom); // bool(false)
?>

Further reading: <http://www.floating-point-gui.de/>
 [2020-03-03 17:09 UTC] ziggi at ziggi dot pl
Well,

My conclusion:

PHP:
echo 2.0 * 2.0;
outcome: 5.0

OMG! Why 2 * 2 is 5 in PHP???

Answer from PHP team:
Because we use shitty C library with twisted precision so 2 * 2 is often 5. Enjoy or use Python.
 [2020-03-03 17:34 UTC] nikic@php.net
> import math
> print(math.fmod(75.6, 25.2))
25.199999999999996

Surprising absolute nobody, Python returns the same result.

Obviously.

Get off my lawn.
 [2020-03-03 17:41 UTC] ziggi at ziggi dot pl
OK,

Not really good at all but obviously "obvious"...

>> Get off my lawn.

I do. Do not get upset so easy, man!
Thank you for your time, anyway.
 [2020-03-03 17:43 UTC] derick@php.net
PERL:

$ perl -e 'use POSIX (); print POSIX::fmod(75.6, 25.2);'
25.2
 [2021-07-23 13:19 UTC] rico dot humme at gmail dot com
As of today this has not yet been resolved, sadly

for($i = 1; $i <= 10; $i++) {
    $dividend = round($i * 3.2, 2);
    echo "fmod($dividend, 3.2) > " . fmod($dividend, 3.2)."\n";
}

Output:
fmod(3.2, 3.2) > 0
fmod(6.4, 3.2) > 0
fmod(9.6, 3.2) > 3.2
fmod(12.8, 3.2) > 0
fmod(16, 3.2) > 3.2
fmod(19.2, 3.2) > 3.2
fmod(22.4, 3.2) > 3.2
fmod(25.6, 3.2) > 0
fmod(28.8, 3.2) > 3.2
fmod(32, 3.2) > 3.2
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Dec 22 06:01:30 2024 UTC