473,320 Members | 1,993 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

problem with javascript in asp not rounding up..

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,resiz able=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
Aug 22 '08 #1
16 1892
Gazing into my crystal ball I observed =?Utf-8?B?R1ROMTcwNzc3?=
<GT*******@discussions.microsoft.comwriting in
news:44**********************************@microsof t.com:

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,resiz able=
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

Aug 22 '08 #2
"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.

But if you want to use IEEE 754 floating point numbers (as ECMA-262v3
conforming languages do), then you will have to accept that arithmetic
operators introduce computational rounding error.

On the bright side, that error is so small that you can get a string
representation of the value you desire by using Number.ToFixed():

http://msdn.microsoft.com/en-us/libr...0z(VS.85).aspx

--
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.

Aug 22 '08 #3
"GTN170777" <GT*******@discussions.microsoft.comwrote in message
news:44**********************************@microsof t.com...
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,resiz able=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
Aug 22 '08 #4
"Dave Anderson" <NP**********@spammotel.comwrote in message
news:45******************************@posted.visi. ..
"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
Aug 22 '08 #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.
Aug 22 '08 #6
"Dave Anderson" <NP**********@spammotel.comwrote in message
news:O2**************@TK2MSFTNGP02.phx.gbl...
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
Aug 22 '08 #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.
Aug 22 '08 #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.
Aug 22 '08 #9
"Dave Anderson" <NP**********@spammotel.comwrote in message
news:uf**************@TK2MSFTNGP02.phx.gbl...
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
Aug 22 '08 #10
"Dave Anderson" <NP**********@spammotel.comwrote in message
news:eB**************@TK2MSFTNGP04.phx.gbl...
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
Aug 22 '08 #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 chalkboard7/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.
Aug 22 '08 #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.
Aug 22 '08 #13
"Dave Anderson" <NP**********@spammotel.comwrote in message
news:Or**************@TK2MSFTNGP05.phx.gbl...
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 chalkboard7/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
Aug 22 '08 #14
In comp.lang.javascript message <Xn****************************@69.16.18
5.247>, Fri, 22 Aug 2008 13:01:23, Adrienne Boswell <ar****@yahoo.com>
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)
Aug 22 '08 #15
"Dr J R Stockton" <jr*@merlyn.demon.co.ukwrote in message
news:yt**************@invalid.uk.co.demon.merlyn.i nvalid...
In comp.lang.javascript message <Xn****************************@69.16.18
5.247>, Fri, 22 Aug 2008 13:01:23, Adrienne Boswell <ar****@yahoo.com>
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
Aug 23 '08 #16
"Anthony Jones" wrote:
That little funny probably worked with the brain-boxes who got
via the Maths/Physics degrees. Some of us got here the hard way.
Heh. I doubt you'll ever convince someone who went through this book enroute
to a Math degree that he took the easy way:
http://www.amazon.com/Algebra-Serge-Lang/dp/038795385X

--
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.

Aug 23 '08 #17

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

40
by: Chiwa | last post by:
Hey, Expression: Math.floor(x * 100) / 100 x= 4.1 gives 4.09, why in gods name? While other values for x don't give a problem. Thx in advance
6
by: brian.ackermann | last post by:
Hi, Can someone tell me what I'm doing wrong here? It makes sense to me, but fails to actually execute the code. I can't find anything on google, but maybe my search criteria are off. ...
1
by: graemeharnish | last post by:
Hello. I'm trying to mod an open source app called TinyERP and inherit from a parent object, and in essence change how _column is defined. I found sample code of: class...
20
by: jacob navia | last post by:
Hi "How can I round a number to x decimal places" ? This question keeps appearing. I would propose the following solution #include <float.h> #include <math.h>
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.