[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Decimal precision

Subject: RE: Decimal precision
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 2 Feb 2005 23:01:36 -0000
xsl precision
You are using

sum(claim/claim_line/reimbursement_amount)

and I suspect you haven't validated the source document against a schema,
which means that reimbursement_amount is an untyped value. When an
untypedAtomic value is supplied as input to a numeric function such as
sum(), then it is treated as a double, and the arithmetic is done in
floating point. You either need to validate against a schema, or you need to
convert to a decimal "by hand":

sum(claim/claim_line/reimbursement_amount/xs:decimal(.))

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Jim Neff [mailto:jneff@xxxxxxxxxxxxxxx] 
> Sent: 02 February 2005 21:47
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE:  Decimal precision
> 
> Thank you for your response Michael.
> 
> Below is my stylesheet.  I'm using Saxon 8.?
> 
> 
> > So summing a set of money amounts should give you the right 
> > answer without any rounding errors.
> > 
> > Michael Kay
> 
> 
> I am getting rounding errors still.  Is there something I am not doing
> correctly to get this to "auto-detect" decimals for version 2 ?
> 
> I've gotten around this with the format-number function for 
> now.  I was just
> wondering why this didn't work for me as expected.
> 
> I am not using Schemas.  Do I need to, or is there a way to 
> tell the Sum()
> function to make sure it treats claim_line/reimbursement_amount as a
> decimal? 
> 
> I tried sum(xs:decimal(claim_line/reimbursement_amount)) but 
> the parser told
> me where to go with that.
> 
> Or do I just need to break down and learn Schemas?
> 
> 
> Here is my stylesheet:
> 
> <xsl:transform
>    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>    version="2.0"
>    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
>    exclude-result-prefixes="xs">
>    
>    <xsl:output method="xml" indent="yes"/>
>    <xsl:strip-space elements="*"/>
>    
>    <xsl:template match="claim_file">
>    
>    	<xsl:element name="file_root">
>    
>    		<xsl:apply-templates select="provider" >
> 		
> 			<xsl:sort select="provider_number" 
> order="ascending"
> data-type="number"/>
> 		
> 		</xsl:apply-templates>
> 		
> 	</xsl:element>
> 		   
>    </xsl:template>
>    
>    <xsl:template match="provider">
>    
>    	<xsl:element name="provider">
> 		
> 		<xsl:element name="claim_sum">
> 		
> 			<xsl:value-of
> select="sum(claim/claim_line/reimbursement_amount)"/>
> 					
> 		</xsl:element>		
> 		
> 	</xsl:element>
>    
>    </xsl:template>
>       
> </xsl:transform>
> 
> 
> Sample input xml document:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <claim_file>
>    <provider>
>       <provider_number>123456</provider_number>
>       <claim>
>           <claim_line>
>             <reimbursement_amount>45.00</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>23.95</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>56.36</reimbursement_amount>
>          </claim_line>
>       </claim>
>       <claim>
>          <claim_line>
>             <reimbursement_amount>45.00</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>23.95</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>37.04</reimbursement_amount>
>          </claim_line>
>       </claim>
>       <claim>
>          <claim_line>
>             <reimbursement_amount>45.00</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>23.95</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>37.04</reimbursement_amount>
>          </claim_line>
>       </claim>
>       <claim>
>          <claim_line>
>             <reimbursement_amount>45.00</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>23.95</reimbursement_amount>
>          </claim_line>
>          <claim_line>
>             <reimbursement_amount>43.00</reimbursement_amount>
>          </claim_line>
>       </claim>
>    </provider> 
> 
> My output is:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <file_root>
>    <provider>
>       <claim_sum>449.23999999999995</claim_sum>
>    </provider>
> </file_root>

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.