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

John Wagenleitner commented on GROOVY-6922:
-------------------------------------------

This is somewhat related to the changes for GROOVY-6674 and [commit 
842bcd4|https://github.com/apache/incubator-groovy/commit/842bcd4e23fefdf5b5e17d8d91af50e1ce565096]
 that changed the decimal return types from double to BigDecimal.  The assert 
{{assert 123.40G == 123.4G}} passes and the numbers are equivalent.  However, 
the reduction in scale of the number might be unexpected and is different in 
pre-2.3 releases.

{code}
def num = new groovy.json.JsonSlurper().parseText('{"num": 123.40}').num
assert num instanceof BigDecimal
assert 2 == num.scale()  // fails: scale is 1
{code}

One way to fix with the least change would be to change this 
[{{lvalue#divide(java.math.BigDecimal)}}|https://github.com/apache/incubator-groovy/blob/e6185f9e33d40039c2140751ade37972046b676f/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java#L667]
 to use the 
[{{#divide(java.math.BigDecimal,int,java.math.RoundingMode)}}|http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#divide(java.math.BigDecimal,%20int,%20java.math.RoundingMode)]
 method using {{digitsPastPoint}} for the scale and 
{{RoundingMode.UNNECESSARY}}.

However, I think a lot of the code is left over from when it was originally 
parsing to a Double.  So I think a better but bigger change would be to 
[replace the bulk of the parseJsonNumber 
method|https://github.com/apache/incubator-groovy/blob/e6185f9e33d40039c2140751ade37972046b676f/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java#L657-L672]
 with a call to {{BigDecimal}} ctor that takes a buffer, offset and length.  
This would have the added benefit of eliminating the String allocations.

> JsonSlurper loses trailing 0's in numbers (regression in Groovy 2.3)
> --------------------------------------------------------------------
>
>                 Key: GROOVY-6922
>                 URL: https://issues.apache.org/jira/browse/GROOVY-6922
>             Project: Groovy
>          Issue Type: Bug
>          Components: JSON
>    Affects Versions: 2.3.0, 2.4.3
>            Reporter: Craig
>
> In previous versions of Grails before JsonSlurper was significantly changed, 
> this test passed. However, it fails in Groovy 2.3.x (tested up to 2.3.3).
> {code}
> void testParseNumWithDecimals() {
>    def i = parser.parseText('123.40')
>    BigDecimal i2 = 123.40G
>    assert i instanceof BigDecimal
>    assert i == i2
> }
> {code}
> This test should be added to 
> https://github.com/groovy/groovy-core/blob/GROOVY_2_3_X/subprojects/groovy-json/src/test/groovy/groovy/json/JsonSlurperTest.groovy
> In Groovy 2.3.3, the assertion fails as i = 123.4G, not 123.40G.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to