problem with javascript in asp not rounding up..

Discussion in 'ASP General' started by GTN170777, Aug 22, 2008.

  1. GTN170777

    GTN170777 Guest

    Hi All,

    I have a neat little script that calculates price based on quantity without
    refreshing the page.. the script is -

    <script type="text/javascript">
    function OpenWin(url)
    {
    window.open(url,'win','scrollbars=1,status=0,resizable=0,width=200,height=265');
    }


    function btnCalculate_onclick()
    {
    var numQty;
    var adprice;

    if (isNaN(document.frmClient.txtQty.value))
    {
    alert('Please enter a number for advert quantity.');
    }
    else
    {
    numQty = parseInt(document.frmClient.txtQty.value);
    adprice = parseInt(document.frmClient.adprice.value);

    if((numQty >= 1) && (numQty <= 1)){
    document.getElementById('divPrice').innerHTML = '£' + adprice + ' + VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    Math.round(100*(adprice * numQty))/100 + ' + VAT';
    } else if((numQty >= 2) && (numQty <= 10)){
    document.getElementById('divPrice').innerHTML = '£' +
    (Math.round(adprice * numQty)*.95)/numQty + ' + VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    Math.round(adprice * numQty)*.95 + ' + VAT';
    } else if((numQty >= 11) && (numQty <= 20)){
    document.getElementById('divPrice').innerHTML = '£' +
    (Math.round(adprice * numQty)*.85)/numQty + ' + VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    Math.round(adprice * numQty)*.85 + ' + VAT';
    } else if((numQty >= 21) && (numQty <= 30)){
    document.getElementById('divPrice').innerHTML = '£' +
    (Math.round(adprice * numQty)*.75)/numQty + ' + VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    Math.round(adprice * numQty)*.75 + ' + VAT';
    } else if((numQty >= 31) && (numQty <= 50)){
    document.getElementById('divPrice').innerHTML = '£' +
    (Math.round(adprice * numQty)*.5)/numQty + ' + VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    Math.round(adprice * numQty)*.5 + ' + VAT';
    } else {
    alert("Please contact us for more information about the benefits of our
    monthly account packages.");
    }
    }
    }</script>

    The problem I have is that it doesn't round up, for instance in stead of
    £0.95 i get £0.9499999999998.

    Does anyone have any ideas how to fix this?

    Many thanks
     
    GTN170777, Aug 22, 2008
    #1
    1. Advertising

  2. Gazing into my crystal ball I observed =?Utf-8?B?R1ROMTcwNzc3?=
    <> writing in
    news::

    ASP has no knowledge of the client, this is a client side issue.
    Followups set to comp.lang.javascript.

    > Hi All,
    >
    > I have a neat little script that calculates price based on quantity
    > without refreshing the page.. the script is -
    >
    ><script type="text/javascript">
    > function OpenWin(url)
    > {
    > window.open(url,'win','scrollbars=1,status=0,resizable=

    0,widt
    > h=200,height=265');
    > }
    >
    >
    > function btnCalculate_onclick()
    > {
    > var numQty;
    > var adprice;
    >
    > if (isNaN(document.frmClient.txtQty.value))
    > {
    > alert('Please enter a number for advert quantity.');
    > }
    > else
    > {
    > numQty = parseInt(document.frmClient.txtQty.value);
    > adprice = parseInt(document.frmClient.adprice.value);
    >
    > if((numQty >= 1) && (numQty <= 1)){
    > document.getElementById('divPrice').innerHTML = '£' + adprice + '
    > + VAT'; document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(100*(adprice * numQty))/100 + ' + VAT';
    > } else if((numQty >= 2) && (numQty <= 10)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.95)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.95 + ' + VAT';
    > } else if((numQty >= 11) && (numQty <= 20)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.85)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.85 + ' + VAT';
    > } else if((numQty >= 21) && (numQty <= 30)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.75)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.75 + ' + VAT';
    > } else if((numQty >= 31) && (numQty <= 50)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.5)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.5 + ' + VAT';
    > } else {
    > alert("Please contact us for more information about the benefits
    > of our
    > monthly account packages.");
    > }
    > }
    > }</script>
    >
    > The problem I have is that it doesn't round up, for instance in stead
    > of £0.95 i get £0.9499999999998.
    >
    > Does anyone have any ideas how to fix this?
    >
    > Many thanks
    >




    --
    Adrienne Boswell at Home
    Arbpen Web Site Design Services
    http://www.cavalcade-of-coding.info
    Please respond to the group so others can share
     
    Adrienne Boswell, Aug 22, 2008
    #2
    1. Advertising

  3. "GTN170777" <> wrote in message
    news:...
    > Hi All,
    >
    > I have a neat little script that calculates price based on quantity

    without
    > refreshing the page.. the script is -
    >
    > <script type="text/javascript">
    > function OpenWin(url)
    > {
    >

    window.open(url,'win','scrollbars=1,status=0,resizable=0,width=200,height=26
    5');
    > }
    >
    >
    > function btnCalculate_onclick()
    > {
    > var numQty;
    > var adprice;
    >
    > if (isNaN(document.frmClient.txtQty.value))
    > {
    > alert('Please enter a number for advert quantity.');
    > }
    > else
    > {
    > numQty = parseInt(document.frmClient.txtQty.value);
    > adprice = parseInt(document.frmClient.adprice.value);
    >
    > if((numQty >= 1) && (numQty <= 1)){
    > document.getElementById('divPrice').innerHTML = '£' + adprice + ' +

    VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(100*(adprice * numQty))/100 + ' + VAT';
    > } else if((numQty >= 2) && (numQty <= 10)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.95)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.95 + ' + VAT';
    > } else if((numQty >= 11) && (numQty <= 20)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.85)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.85 + ' + VAT';
    > } else if((numQty >= 21) && (numQty <= 30)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.75)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.75 + ' + VAT';
    > } else if((numQty >= 31) && (numQty <= 50)){
    > document.getElementById('divPrice').innerHTML = '£' +
    > (Math.round(adprice * numQty)*.5)/numQty + ' + VAT';
    > document.getElementById('maindivPrice').innerHTML = '£' +
    > Math.round(adprice * numQty)*.5 + ' + VAT';
    > } else {
    > alert("Please contact us for more information about the benefits of

    our
    > monthly account packages.");
    > }
    > }
    > }</script>
    >
    > The problem I have is that it doesn't round up, for instance in stead of
    > £0.95 i get £0.9499999999998.
    >
    > Does anyone have any ideas how to fix this?


    The short answer is do not concatenate a number directly in to a string use
    the Number object's .toFixed method.

    var n = 250 * 0.83
    var s = n.toFixed(2)

    However while I'm here have you noticed that the code in each of your Ifs
    are identical except for that multiplier value changes? This pattern should
    cause you to see a need for a function the can get the multiplier value. In
    the code below I've refactored out a function which returns the discount for
    a specified quantity. Note that by returning the actual discount in this
    function it makes the relationship between the quantity and the discount
    given much clearer.


    I've made a business decision (which clearly you may disagree with) to
    discount the unit price then multiply the quantity by the discounted price.
    This is less likely to be disputed by a user IMO.

    I use Math.round to ensure the discounted price is to the nearest penny.
    That still doesn't eliminate the need to use .toFixed since Numbers are
    stored as floating point values which cannot exactly represent numbers
    exactly only to a reasonable degree of precision.


    function btnCalculate_onclick()
    {

    var numQty = parseInt(document.frmClient.txtQty.value);
    var adprice = parseInt(document.frmClient.adprice.value);

    if (isNaN(numQty))
    {
    alert('Please enter a number for advert quantity.');
    }
    else
    {
    var multiplier = null;

    try { multiplier = 1 - getDiscount(numQty) }
    catch(e) { alert(e); }

    if (multiplier)
    {
    var discountedUnitPrice = Math.round(adprice * multiplier * 100) / 100
    document.getElementById('divPrice').innerHTML = '£' +
    discountedUnitPrice.toFixed(2) + '+ VAT';
    document.getElementById('maindivPrice').innerHTML = '£' +
    (discountedUnitPrice * numQty).toFixed(2) + ' + VAT';
    }
    }
    }

    function getDiscount(numQty)
    {
    if (numQty <= 1) return 0
    if (numQty <= 10) return 0.05
    if (numQty <= 20) return 0.15
    if (numQty <= 30) return 0.25
    if (numQty <= 50) return 0.5
    throw "Please contact us for more information about the benefits of our
    monthly account packages."
    }



    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #3
  4. "Dave Anderson" <> wrote in message
    news:...
    > "GTN170777" wrote:
    > > The problem I have is that it doesn't round up, for instance
    > > in stead of £0.95 i get £0.9499999999998.
    > >
    > > Does anyone have any ideas how to fix this?

    >
    > Yes. Avoid using binary digits to represent non-integer rational numbers.
    >



    How would one go about such an avoidance?

    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #4
  5. Anthony Jones wrote:
    >> Yes. Avoid using binary digits to represent non-integer rational
    >> numbers.

    >
    > How would one go about such an avoidance?


    There are boundless examples. My grandparents managed to avoid it their
    entire lives.



    --
    Dave Anderson

    Unsolicited commercial email will be read at a cost of $500 per message. Use
    of this email address implies consent to these terms.
     
    Dave Anderson, Aug 22, 2008
    #5
  6. "Dave Anderson" <> wrote in message
    news:...
    > Anthony Jones wrote:
    > >> Yes. Avoid using binary digits to represent non-integer rational
    > >> numbers.

    > >
    > > How would one go about such an avoidance?

    >
    > There are boundless examples. My grandparents managed to avoid it their
    > entire lives.
    >



    Great you've got plenty to choose from then, perhaps you could just present
    just one?


    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #6
  7. Anthony Jones wrote:
    >>>> Yes. Avoid using binary digits to represent non-integer rational
    >>>> numbers.
    >>>
    >>> How would one go about such an avoidance?

    >>
    >> There are boundless examples. My grandparents managed to avoid it
    >> their entire lives.

    >
    > Great you've got plenty to choose from then, perhaps you could just
    > present just one?


    MAN1: It hurts when I hit my fingers with a hammer.
    MAN2: Try to avoid hitting your fingers.
    MAN3: How could MAN1 do that?
    MAN2: By not hitting them with a hammer.
    MAN3: Can you give me examples? Just one?

    Do you really want to go down this path, Anthony?



    --
    Dave Anderson

    Unsolicited commercial email will be read at a cost of $500 per message. Use
    of this email address implies consent to these terms.
     
    Dave Anderson, Aug 22, 2008
    #7
  8. Anthony Jones wrote:
    > ...Numbers are stored as floating point values which cannot
    > exactly represent numbers exactly only to a reasonable degree
    > of precision...


    This is not completely true. IEEE 754 double-precision floating point
    numbers CAN and DO represent integers between -9007199254740992 and
    9007199254740992 exactly. In addition, there are a whole bunch of
    non-integer rational numbers that can be precisely represented.

    Since you like examples, here's one:

    EXAMPLE: 0.5



    --
    Dave Anderson

    Unsolicited commercial email will be read at a cost of $500 per message. Use
    of this email address implies consent to these terms.
     
    Dave Anderson, Aug 22, 2008
    #8
  9. "Dave Anderson" <> wrote in message
    news:...
    > Anthony Jones wrote:
    > >>>> Yes. Avoid using binary digits to represent non-integer rational
    > >>>> numbers.
    > >>>
    > >>> How would one go about such an avoidance?
    > >>
    > >> There are boundless examples. My grandparents managed to avoid it
    > >> their entire lives.

    > >
    > > Great you've got plenty to choose from then, perhaps you could just
    > > present just one?

    >
    > MAN1: It hurts when I hit my fingers with a hammer.
    > MAN2: Try to avoid hitting your fingers.
    > MAN3: How could MAN1 do that?
    > MAN2: By not hitting them with a hammer.
    > MAN3: Can you give me examples? Just one?
    >
    > Do you really want to go down this path, Anthony?
    >



    Yes, yes! Show me please a simple example of avoiding using binary digits
    to represent a non-integer rational number?

    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #9
  10. "Dave Anderson" <> wrote in message
    news:...
    > Anthony Jones wrote:
    > > ...Numbers are stored as floating point values which cannot
    > > exactly represent numbers exactly only to a reasonable degree
    > > of precision...

    >
    > This is not completely true. IEEE 754 double-precision floating point
    > numbers CAN and DO represent integers between -9007199254740992 and
    > 9007199254740992 exactly. In addition, there are a whole bunch of
    > non-integer rational numbers that can be precisely represented.
    >


    By 'numbers' I meant the whole set of numbers. Not just a finite few.


    > Since you like examples, here's one:
    >
    > EXAMPLE: 0.5
    >


    I get the idea poor, choice of example though. 0.5 is a power of 2
    therefore a mantissa with the value of 2 and an exponent of -1 exactly
    represents 0.5. Mind you it was 20 years ago that I read the 754 spec I
    could be wrong ;)


    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #10
  11. Anthony Jones wrote:
    >> Do you really want to go down this path, Anthony?

    >
    > Yes, yes! Show me please a simple example of avoiding using
    > binary digits to represent a non-integer rational number?


    Since I cannot easily avoid representing text while posting to USENET, I
    will not try. But I will offer a description of a real-world example:

    <written on chalkboard> 7/3 </written on chalkboard>

    You forgot to ask for EXACT representation, BTW.


    --
    Dave Anderson

    Unsolicited commercial email will be read at a cost of $500 per message. Use
    of this email address implies consent to these terms.
     
    Dave Anderson, Aug 22, 2008
    #11
  12. Anthony Jones wrote:
    >>> ...Numbers are stored as floating point values which cannot
    >>> exactly represent numbers exactly only to a reasonable degree
    >>> of precision...

    >>
    >> This is not completely true. IEEE 754 double-precision floating point
    >> numbers CAN and DO represent integers between -9007199254740992 and
    >> 9007199254740992 exactly. In addition, there are a whole bunch of
    >> non-integer rational numbers that can be precisely represented.

    >
    > By 'numbers' I meant the whole set of numbers. Not just a finite few.


    There is no way to represent every member of ANY infinite set with a finite
    set of bits, so what else could you mean? Let's at least agree on this --
    ECMA/J/JavaScript Number Objects can not represent more than 2^64 unique
    values.


    >> Since you like examples, here's one:
    >>
    >> EXAMPLE: 0.5

    >
    > I get the idea poor, choice of example though. 0.5 is a power of 2
    > therefore a mantissa with the value of 2 and an exponent of -1 exactly
    > represents 0.5.


    Doesn't that actually make it an *illustrative* choice of example, since the
    only non-integer rationals that can be precisely represented with IEEE 754
    floats MUST have only powers of two in the denominator?



    --
    Dave Anderson

    Unsolicited commercial email will be read at a cost of $500 per message. Use
    of this email address implies consent to these terms.
     
    Dave Anderson, Aug 22, 2008
    #12
  13. "Dave Anderson" <> wrote in message
    news:...
    > Anthony Jones wrote:
    > >> Do you really want to go down this path, Anthony?

    > >
    > > Yes, yes! Show me please a simple example of avoiding using
    > > binary digits to represent a non-integer rational number?

    >
    > Since I cannot easily avoid representing text while posting to USENET, I
    > will not try. But I will offer a description of a real-world example:
    >
    > <written on chalkboard> 7/3 </written on chalkboard>
    >
    > You forgot to ask for EXACT representation, BTW.
    >



    Oh I see now what you meant was to stop asking a computer to represent
    non-integer rational number.

    That little funny probably worked with the brain-boxes who got via the
    Maths/Physics degrees. Some of us got here the hard way. I didn't get it.
    I thought you actually being serious and I was missing something
    fundemental.

    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 22, 2008
    #13
  14. In comp.lang.javascript message <Xns9B023D4525689arbpenyahoocom@69.16.18
    5.247>, Fri, 22 Aug 2008 13:01:23, Adrienne Boswell <>
    posted:
    >> The problem I have is that it doesn't round up, for instance in stead
    >> of £0.95 i get £0.9499999999998.
    >>
    >> Does anyone have any ideas how to fix this?


    You could try reading the FAQ of comp.lang.javascript, and/or my site.

    A programmer should know that binary floats can represent few simple
    decimal fractions exactly.

    If your results are hoped to be in pounds, with a 2-digit decimal
    fraction part, then calculate in pence and insert the point as part of
    output formatting.

    --
    (c) John Stockton, nr London, UK. ?@merlyn.demon.co.uk Turnpike v6.05 MIME.
    Web <URL:http://www.merlyn.demon.co.uk/> - FAQish topics, acronyms, & links.
    Proper <= 4-line sig. separator as above, a line exactly "-- " (SonOfRFC1036)
    Do not Mail News to me. Before a reply, quote with ">" or "> " (SonOfRFC1036)
     
    Dr J R Stockton, Aug 22, 2008
    #14
  15. "Dr J R Stockton" <> wrote in message
    news:...
    > In comp.lang.javascript message <Xns9B023D4525689arbpenyahoocom@69.16.18
    > 5.247>, Fri, 22 Aug 2008 13:01:23, Adrienne Boswell <>
    > posted:
    > >> The problem I have is that it doesn't round up, for instance in stead
    > >> of £0.95 i get £0.9499999999998.
    > >>
    > >> Does anyone have any ideas how to fix this?

    >
    > You could try reading the FAQ of comp.lang.javascript, and/or my site.
    >
    > A programmer should know that binary floats can represent few simple
    > decimal fractions exactly.
    >
    > If your results are hoped to be in pounds, with a 2-digit decimal
    > fraction part, then calculate in pence and insert the point as part of
    > output formatting.
    >



    The floating point type works sufficiently for most reasonable figures such
    as in this case. It has to be understood that you need to be careful when
    dealing with money since from a users perspective you can present inaccurate
    figures due to rounding problems even when using integer math internally.

    In the abscence of a decimal type, unless you demonstrate really good
    reasons otherwise, stick with float and keep it simple. Dealing with
    figures in the the £10K region with simple percentage calculations will not
    result in bad stuff happening. Especially if the customer likes to see how
    things are calculated and the figures they see on screen need to add up.





    --
    Anthony Jones - MVP ASP/ASP.NET
     
    Anthony Jones, Aug 23, 2008
    #15
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jimmy zhang

    math.pow rounding problem

    Jimmy zhang, Dec 4, 2004, in forum: Java
    Replies:
    15
    Views:
    3,675
    Chris Smith
    Dec 7, 2004
  2. Active8
    Replies:
    4
    Views:
    397
    Active8
    Feb 22, 2005
  3. Andy Leszczynski

    rounding problem

    Andy Leszczynski, Feb 24, 2005, in forum: Python
    Replies:
    7
    Views:
    528
    Nick Coghlan
    Feb 26, 2005
  4. Fuzzydave

    round not rounding to 0 places

    Fuzzydave, Aug 16, 2006, in forum: Python
    Replies:
    6
    Views:
    414
    Sybren Stuvel
    Aug 16, 2006
  5. Keflavich
    Replies:
    13
    Views:
    731
    J. Robertson
    Dec 14, 2007
Loading...

Share This Page