| 
	
 | 
 Posted by bill on 02/01/08 19:23 
Jerry Stuckle wrote: 
> The Natural Philosopher wrote: 
>> Jerry Stuckle wrote: 
>>> The Natural Philosopher wrote: 
>>>> Rik Wasmus wrote: 
>>>>> On Fri, 01 Feb 2008 16:59:18 +0100, The Natural Philosopher <a@b.c>  
>>>>> wrote: 
>>>>>> The question says it all. 
>>>>>> 
>>>>>> I have an input box, which I fill in with a price. 
>>>>>> IOt gets passed to the main form as a variable, then shoved into  
>>>>>> an SQL   field vue a print '%d' statement where the argument is  
>>>>>> $price*100. 
>>>>> 
>>>>> Could you give us the exact code & input values? And what database  
>>>>> (&version) are you using? 
>>>>> 
>>>>>> For some reaosn, this particular value goes to 6998. 
>>>>>> 
>>>>>> If I update hee database manually to 6999, it displays as 69.99. 
>>>>>> 
>>>>>> If I enter 69.999 it updates as 6999..not 69999 
>>>>> 
>>>>> Seems to have something to do with float/double precision. However,  
>>>>> the precision isn't that big, and I cannot reproduce it in PHP 5.2  
>>>>> here.. 
>>>>> 
>>>>> PHP5.2.4: 
>>>>> <?php echo 69.99*100 ?> => output 6999 
>>>>> MySQL5.0.45-community-nt: 
>>>>> SELECT CAST(69.99*100 AS UNSIGNED); => 6999 
>>>> 
>>>> Rik. Its worse than that NOTHING to do with databases. 
>>>> 
>>>> Here is a code fragment. 
>>>> 
>>>> echo $sale_price."<br>\r\n";             // gives 69.99 
>>>> printf ("%d<br>\r\n",($sale_price*100)); //gives 6998 
>>>> $xxx=$sale_price*100; 
>>>> echo $xxx."<br>\r\n";                    // gives 6999 
>>>> printf ("%d<br>\r\n",$xxx);             //gives 6998 
>>>> 
>>>> 
>>>> Now $sale_price comes from a text type input via a _POST_ variable,  
>>>> so I guess its 'text' as its raw form PHP invisible casting drives  
>>>> me nuts, so you can tell ME what $xxx is... 
>>>> 
>>> 
>>> According to the PHP manual: 
>>> 
>>> %d - the argument is treated as an integer, and presented as a  
>>> (signed) decimal number. 
>>> 
>>> Which means it is truncating instead of rounding. 
>>> 
>>> 69.99 is not exact.  It's approximately 69.98999999999999488409. 
>>> 
>>> So 69.99*100 comes out to be 6998.999999999999488409 and truncated  
>>> you get 6998. 
>>> 
>> Right. So every other php funtion treats 6999 as 6999,. except  
>> printf's %d. 
>> 
>> If you use %s, it works.. 
>> 
>> Invisible casting has to be the worst thing ever. That's WHY I did it  
>> all in cents (or pence)to avoid these pissing float issues. 
>> 
>> Is there a function that takes 69.99*100 and makes it a properly  
>> rounded integer? 
>> 
>> 
>> 
>> 
>> 
>> 
>  
> round(). 
>  
A bit verbose, don't you think, Jerry ? <g>
 
  
Navigation:
[Reply to this message] 
 |