[ 
https://issues.apache.org/jira/browse/OLINGO-1087?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15891918#comment-15891918
 ] 

Ralf Handl commented on OLINGO-1087:
------------------------------------

OData V2's data type Edm.Decimal follows the rules for the SQL type 
DECIMAL(p,s) or NUMBER(p,s), see e.g. 
https://msdn.microsoft.com/en-us/library/ms190476.aspx. It is a decimally 
stored fixed-point number, see 
https://en.wikipedia.org/wiki/Fixed-point_arithmetic.

Precision in this context is the length of the decimal mantissa, and Scale is 
the negative exponent of the base-10 scaling factor. This means that you have 
to take both Precision and Scale into account in this discussion. 

For the rather lengthy number above you'd need Precision=35 and Scale=35 to 
store it losslessly in a DECIMAL column of a SQL database, limiting you to 
storing numbers that are greater than -1 and less than 1 with 35 decimal digits 
to the right of the decimal point. 

Example 17 in 
http://docs.oasis-open.org/odata/odata-csdl-xml/v4.01/csprd01/odata-csdl-xml-v4.01-csprd01.html#_Toc472333020
 explains this for the more readable case of Precision=2 and Scale=2.

> Precision in EdmDecimal not calculated correctly
> ------------------------------------------------
>
>                 Key: OLINGO-1087
>                 URL: https://issues.apache.org/jira/browse/OLINGO-1087
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata2-core
>    Affects Versions: V2 2.0.8
>            Reporter: Svante von Erichsen
>         Attachments: 0001-OLINGO-1087-Fix-calculation-of-precision.patch
>
>
> The "precision" found in a read number is currently at least the number of 
> decimals (omitting trailing zeroes).  That seems to be wrong, or at least not 
> consistent with at least some server side view of the matter, for numbers 
> smaller than 0.1 (the number shown has 35 decimals, but precision 34):
> org.apache.olingo.odata2.api.edm.EdmSimpleTypeException: The metadata 
> constraints '[Precision=34]' do not match the literal 
> '0.08102359900000000170194880411145277'.
>                 at 
> org.apache.olingo.odata2.core.edm.EdmDecimal.internalValueOfString(EdmDecimal.java:107)
>                 at 
> org.apache.olingo.odata2.core.edm.AbstractSimpleType.valueOfString(AbstractSimpleType.java:91)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonPropertyConsumer.readSimpleProperty(JsonPropertyConsumer.java:236)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonPropertyConsumer.readPropertyValue(JsonPropertyConsumer.java:169)
>                 ... 69 common frames omitted
> Wrapped by: org.apache.olingo.odata2.api.ep.EntityProviderException: An 
> exception of type 'EdmSimpleTypeException' occurred.
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonPropertyConsumer.readPropertyValue(JsonPropertyConsumer.java:171)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonEntryConsumer.handleName(JsonEntryConsumer.java:172)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonEntryConsumer.readEntryContent(JsonEntryConsumer.java:130)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonEntryConsumer.readFeedEntry(JsonEntryConsumer.java:117)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonFeedConsumer.readArrayContent(JsonFeedConsumer.java:153)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonFeedConsumer.handleName(JsonFeedConsumer.java:122)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonFeedConsumer.readFeedContent(JsonFeedConsumer.java:111)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonFeedConsumer.readFeed(JsonFeedConsumer.java:96)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonFeedConsumer.readFeedStandalone(JsonFeedConsumer.java:63)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonEntityConsumer.readDeltaFeed(JsonEntityConsumer.java:95)
>                 at 
> org.apache.olingo.odata2.core.ep.consumer.JsonEntityConsumer.readFeed(JsonEntityConsumer.java:81)
>                 at 
> org.apache.olingo.odata2.core.ep.JsonEntityProvider.readFeed(JsonEntityProvider.java:309)
>                 at 
> org.apache.olingo.odata2.core.ep.ProviderFacadeImpl.readFeed(ProviderFacadeImpl.java:165)
>                 at 
> org.apache.olingo.odata2.api.ep.EntityProvider.readFeed(EntityProvider.java:676)



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to