Edit report at http://bugs.php.net/bug.php?id=51320&edit=1
ID: 51320 Updated by: ras...@php.net Reported by: woody dot gilk at gmail dot com Summary: Modulus Fails with the number 2.32 Status: Bogus Type: Bug Package: *General Issues Operating System: OSX, Linux PHP Version: Irrelevant New Comment: I meant: > var_dump(((int) (100 * 2.32))) there Previous Comments: ------------------------------------------------------------------------ [2010-03-21 20:30:51] ras...@php.net You didn't check your integer conversion. > var_dump(((int) (100 * 2.32)) % 100); int(231) 2.32 cannot be represented accurately in a computer. It is actually 2.319999999999 so whenever you do things like floor() or modulus that relies on decimals being precise down to a very low precision you have to account for that. round() it first to be safe. ------------------------------------------------------------------------ [2010-03-21 20:15:41] woody dot gilk at gmail dot com I don't believe this is actually bogus, but may rather be an error in the way that PHP converts from float point to integer. Consider: var_dump(((int) (100 * 2.32)) % 100); var_dump(232 % 100); Even though the value of (100 * 2.32) is converted to an integer with a value of "232", the modulus still fails. Maybe this is the bug that really exists? ------------------------------------------------------------------------ [2010-03-21 20:04:59] johan...@php.net Floating point values have a limited precision. Hence a value might not have the same string representation after any processing. That also includes writing a floating point value in your script and directly printing it without any mathematical operations. If you would like to know more about "floats" and what IEEE 754 is, read this: http://docs.sun.com/source/806-3568/ncg_goldberg.html Thank you for your interest in PHP. . ------------------------------------------------------------------------ [2010-03-18 10:55:21] woody dot gilk at gmail dot com Sorry, the test script $number value should be "2.32" not "3.32", the improper value of "31" is only reported for "2.32", no other numbers. ------------------------------------------------------------------------ [2010-03-18 10:53:26] woody dot gilk at gmail dot com Description: ------------ Tested on the following PHP versions: 5.3.2 (OSX) 5.2.5 (Linux, Codepad.org) 5.2.4 (Ubuntu) The following script improperly reports the modulus as "31" instead of "32", but doesn't seem to happen with any other numbers. Test script: --------------- <?php $number = 3.32; echo ($number * 100) % 100; Expected result: ---------------- 32 Actual result: -------------- 31 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51320&edit=1