|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-07-02 16:30 UTC] fabrizio at queensboro dot com
Description: ------------ Converting from a float to an integer doesn't always return the correct values. Try this code: <?php $grand_total = 8.9500; $amount = intval($grand_total*100); var_dump($amount, $grand_total*100, (int)($grand_total*100)); ?> This will output: int(894) float(895) int(894) when I would expect: int(895) float(895) int(895) Test script: --------------- <?php $grand_total = 8.9500; $amount = intval($grand_total*100); var_dump($amount, $grand_total*100, (int)($grand_total*100)); ?> Expected result: ---------------- int(895) float(895) int(895) Actual result: -------------- int(894) float(895) int(894) PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Dec 05 23:00:01 2025 UTC |
Very interesting. Thank you for your link, I always assumed that this was an issue for old languages and that new ones would have corrected the conversion to integer using some sort of checking against the "to_string" (I am saying this without knowing what it takes or what the code looks like). As you can see here, the code knows that the value is a float(895), without decimals, so the integer should be the same, else I would expect an output like float(894.99999999...) during the var_dump. <?php $grand_total = '8.9500'; var_dump( $grand_total, $grand_total*100, round($grand_total*100), intval($grand_total*100) ); ?> string(6) "8.9500" float(895) float(895) int(894)Well, that is just because your output precision is set low enough so when the value is printed it prints as 895. Try adding this to the top of your test script: ini_set('precision',32); And no, this isn't a modern language vs. old language thing. For example, in Python: Python 2.7.3 (default, Apr 20 2012, 22:39:59) >>> a=8.9500 >>> print a*100 895.0 >>> from math import floor >>> print floor(a*100) 894.0 The way to fix this is to use arbitrary precision math routines and every scripting language, including PHP (see gmp, bcmath) provides those, but they are so much slower than the cpu-provided floating routines that it is hard to justify.