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
 [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: Tue Oct 15 20:01:27 2024 UTC