Addendum:

The simplified expression removes the division, because 2 * .50 is one, and
anything divided by one is itself:

(.50 * (int( 2 * (MoneyValue + .25))))

Bill

On Tue, Aug 30, 2011 at 8:31 AM, Bill Downall <
[email protected]> wrote:

> Oops. The QA department here is going to get fired. There are 2 50 centses
>  in a dollar, so to use INT, I need to multiple halves into wholes, and then
> divide by 2 again.
>
> (Also had a parenthesis missing in the previous try.)
>
> You can simplify the math below, but this seems to work, and shows all the
> numbers in my twisted logic.
>
> create table Money (moneyValue CURR, roundGoal CURR)
> insert into money values (1.24, 1.0)
> insert into money values (1.26, 1.5)
> insert into money values (1.49, 1.5)
> insert into money values (1.51, 1.5)
> insert into money values (1.74, 1.5)
> insert into money values (1.76, 2.0)
> SELECT MoneyValue, +
>     (.50 * (int(( 2 * (MoneyValue + .25))) / (2 * .50) )) as
> RoundExpression, +
>     RoundGoal +
>   FROM Money
>  MoneyValue      RoundExpression RoundGoal
>  --------------- --------------- ---------------
>            $1.24              1.           $1.00
>            $1.26              1.           $1.50
>            $1.49             1.5           $1.50
>            $1.51             1.5           $1.50
>            $1.74             1.5           $1.50
>            $1.76             2.0           $2.00
>
> Bill
>
> On Tue, Aug 30, 2011 at 8:10 AM, William Stacy 
> <[email protected]>wrote:
>
>> Something still wrong there, Bill. plug in 8.55 and you get 8.00.
>>
>> I think Albert's approach is right and was working on a single rather
>> colmplex expression to do the same thing, but then I thought to myself,
>> "Self, why are you doing this?" I mean why would anyone want to purposely
>> detune data like that?  Computers and R:base inherently are accurate to a
>> penny withhout any effort on our part...  Plus rounding can introduce a
>> compounding of errors in certain cases.  Envision a carpenter trading in his
>> 1/16 inch graduated tape for one with 1/2 inch graduations.
>>
>> On Tue, Aug 30, 2011 at 3:44 AM, Bill Downall <
>> [email protected]> wrote:
>>
>>> Sorry, Tom, I didn't think it through. Try this:
>>>
>>> Add .25 to your value, then take the (truncated) integer of the result,
>>> and divide that by .50. That gives you the number of 50-cents in your
>>> answer, so multiply all that by .50, (or divide by 2).
>>>
>>> (.50 * (int((currvalue + .25) / .50 ))
>>>
>>> Bill
>>>
>>>
>>> On Mon, Aug 29, 2011 at 7:40 PM, TOM HART <[email protected]>wrote:
>>>
>>>> Bill,
>>>>     I tried 7.46 and it returned 7.4, but I want 7.5
>>>> Tom
>>>>
>>>> ------------------------------
>>>> *From:* Bill Downall <[email protected]>
>>>> *To:* RBASE-L Mailing List <[email protected]>
>>>> *Sent:* Mon, August 29, 2011 4:59:29 PM
>>>> *Subject:* [RBASE-L] - Re: Rounding
>>>>
>>>> Tom,
>>>>
>>>> Multiply by fifty, find the nearest integer, then divide by 50.
>>>>
>>>> ((nint((50 * currencycolumn)) / 50)
>>>>
>>>> Bill
>>>>
>>>> On Mon, Aug 29, 2011 at 5:17 PM, TOM HART <[email protected]>wrote:
>>>>
>>>>> Is there a way to round currency to the nearest .50,  what I want to do
>>>>> is round currency the the nearest dollar or .50
>>>>> eg
>>>>>
>>>>> $1.76        to        $2.00
>>>>> $1.74        to        $1.50
>>>>> etc
>>>>>
>>>>> Tom Hart
>>>>>
>>>>>
>>>>
>>>
>>
>>
>> --
>> William Stacy, O.D.
>>
>> Please visit my website by clicking on :
>>
>> http://www.folsomeye.net
>>
>>
>>
>>
>

Reply via email to