edzillion Posted February 29, 2008 Share Posted February 29, 2008 Hi I am having some issues with multiplying doubles. I presume php isn't the best for maths, but I want to use it to keep things simple. Basically: If I multiply one double by another like so: function format_price($price){ $doubresult = $price * 31.1034768; return $doubresult; } format_price(15.7389); = 466.552152 format_price(15.7103); = 466.552152 I presume this is because of the way that php rounds down when multiplying numbers with a large amount of decimal places. Any way of doing this accurately? Thanks Ed Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/ Share on other sites More sharing options...
tinker Posted February 29, 2008 Share Posted February 29, 2008 it works better in php than my calc (on linux): 489.53451100752 (php) or (489.534511008 calc) 488.64495157104 (php) or (488.644951571 calc) But you can typecast like this... function format_price($price){ //$doubresult = doubleval($price * 31.1034768); $doubresult = (double)$price * (double)31.1034768; return $doubresult; } print format_price(15.7389)."<br>"; print format_price(15.7103)."<br>"; Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-480269 Share on other sites More sharing options...
hawkenterprises Posted February 29, 2008 Share Posted February 29, 2008 Just to further note Everything is in PHP is a string, kinda like in ASP everything is a DIM until you do something that is TYPE Specific, like math functions or type casting. $IamString = '42'; $IamString *= 24.5; // Now I'm an float (there are no doubles just the names for historical reasons in PHP) $IamString .= 'two for tuesday'; // Now I'm a string again So just remember PHP is type-less language unless explicitly defined. Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-480455 Share on other sites More sharing options...
corbin Posted March 2, 2008 Share Posted March 2, 2008 Sorry for the offtopic-ness. So if you do: $num = 5; echo var_dump($num); Why does it say int? Everything isn't a string, conversions just happen as needed. For example, if you look into the incrementing code of the php, ($i++, $i += x), you'll see that at some point it checks if the new number is greater than the signed integer max (2^31-1) (I don't remember exactly how it checks, but I would imagine it would check if i is 1 less than the max since checking after it rolled over would cause issues lol), and if it is, it will convert it to a float. In the same sense: $i = 5; $i2 = 10; //both numbers are stored as integers $new = $i*i2; echo "{$i} * {$i2} = {$new}"; //or echo $i . ' * ' . $i2 . ' = ' . $new; //The integers are temporarily converted to strings so that they can be concatenated //same sense: $si = '5'; $si2 = '10'; $snew = $si*$si2; //$si and $si2 are converted to a numeric data type, in this case an integer so that they can be multiplied echo "{$si} * {$si2} = {$snew}"; //in this case, si and si2 are already strings, but snew has to be temporarily converted to a string. Therefore, I think it is incorrect to say PHP is a type-less language, but rather it should be said that PHP transitions between types as needed without explicit coder instruction. Then again, I could be entirely wrong, and PHP does store everything in a string; that's just how I've gathered that it works. On topic: PHP has a certain setting for how far it keeps numerical accuracy (I think it defaults to 14), so any decimal places after that are just chopped off I think. Example: C:\Users\Corbin>php -r "echo (double)5.00000000000005;" 5 C:\Users\Corbin>php -r "echo (double)5.0000000000005;" 5.0000000000005 (It's worth noting that without the five, it handles the first one fine...) So, once you get past a certain number of decimal places, it's very difficult to do mathematical operations accurately with the built-in php operators. "I presume php isn't the best for maths" In general, no computer language is good for very minute numbers. C++, C (The 'engine' behind PHP is in C if I remember correctly), Java, and I'm sure other language would run into the exact same problem. Every datatype has it's limitations math wise. A signed integer's happens to be 2^31-1, while the double's max is gigantic (http://en.wikipedia.org/wiki/Double_precision) (The decimal max is dependant on certain factors, but in PHP it seems to always be the configuration directive). (P.S. for number_format(15.7389), Windows calc (calc.exe) gives me 489.53451100752) Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-481843 Share on other sites More sharing options...
hawkenterprises Posted March 2, 2008 Share Posted March 2, 2008 Sorry for the offtopic-ness. So if you do: $num = 5; echo var_dump($num); Why does it say int? Everything isn't a string, conversions just happen as needed. For example, if you look into the incrementing code of the php, ($i++, $i += x), you'll see that at some point it checks if the new number is greater than the signed integer max (2^31-1) (I don't remember exactly how it checks, but I would imagine it would check if i is 1 less than the max since checking after it rolled over would cause issues lol), and if it is, it will convert it to a float. There is a difference between these two statements $num = 5; and $num = '5'; Also it goes more as to how PHP stores the information that is really what I was trying to illustrate. The fact is $num is typeless you are declaring type in the above to statements. Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-481859 Share on other sites More sharing options...
Orio Posted March 2, 2008 Share Posted March 2, 2008 Of course theres a difference. Types are juggled automatically though. If everything was typeless, there wouldn't be functions like is_string(), is_double(), is_bool() etc'. Orio. Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-481905 Share on other sites More sharing options...
corbin Posted March 2, 2008 Share Posted March 2, 2008 Sorry for the offtopic-ness. So if you do: $num = 5; echo var_dump($num); Why does it say int? Everything isn't a string, conversions just happen as needed. For example, if you look into the incrementing code of the php, ($i++, $i += x), you'll see that at some point it checks if the new number is greater than the signed integer max (2^31-1) (I don't remember exactly how it checks, but I would imagine it would check if i is 1 less than the max since checking after it rolled over would cause issues lol), and if it is, it will convert it to a float. There is a difference between these two statements $num = 5; and $num = '5'; Also it goes more as to how PHP stores the information that is really what I was trying to illustrate. The fact is $num is typeless you are declaring type in the above to statements. No, $num is not typless unless you delare the type. In the world of computers, there's no such thing as typeless. "There is a difference between these two statements" That's what I was saying! "Everything is in PHP is a string, kinda like in ASP everything is a DIM until you do something that is TYPE Specific, like math functions or type casting." That's what I was trying to correct, because that is flat out wrong. "So just remember PHP is type-less language unless explicitly defined." Also flat out wrong. Link to comment https://forums.phpfreaks.com/topic/93728-php-maths-issues/#findComment-481924 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.