mirror of
https://github.com/stleary/JSON-java.git
synced 2025-08-03 03:15:32 -04:00
correct error in converting doubles to big decimals
This commit is contained in:
parent
c03054b1a6
commit
579784d73e
@ -1159,6 +1159,18 @@ public class JSONObject {
|
||||
* to convert.
|
||||
*/
|
||||
static BigDecimal objectToBigDecimal(Object val, BigDecimal defaultValue) {
|
||||
return objectToBigDecimal(val, defaultValue, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param val value to convert
|
||||
* @param defaultValue default value to return is the conversion doesn't work or is null.
|
||||
* @param exact When <code>true</code>, then {@link Double} and {@link Float} values will be converted exactly.
|
||||
* When <code>false</code>, they will be converted to {@link String} values before converting to {@link BigDecimal}.
|
||||
* @return BigDecimal conversion of the original value, or the defaultValue if unable
|
||||
* to convert.
|
||||
*/
|
||||
static BigDecimal objectToBigDecimal(Object val, BigDecimal defaultValue, boolean exact) {
|
||||
if (NULL.equals(val)) {
|
||||
return defaultValue;
|
||||
}
|
||||
@ -1172,7 +1184,14 @@ public class JSONObject {
|
||||
if (!numberIsFinite((Number)val)) {
|
||||
return defaultValue;
|
||||
}
|
||||
return new BigDecimal(((Number) val).doubleValue());
|
||||
if (exact) {
|
||||
return new BigDecimal(((Number)val).doubleValue());
|
||||
}else {
|
||||
// use the string constructor so that we maintain "nice" values for doubles and floats
|
||||
// the double constructor will translate doubles to "exact" values instead of the likely
|
||||
// intended representation
|
||||
return new BigDecimal(val.toString());
|
||||
}
|
||||
}
|
||||
if (val instanceof Long || val instanceof Integer
|
||||
|| val instanceof Short || val instanceof Byte){
|
||||
@ -2132,8 +2151,8 @@ public class JSONObject {
|
||||
// BigDecimal should be able to handle all of our number types that we support through
|
||||
// documentation. Convert to BigDecimal first, then use the Compare method to
|
||||
// decide equality.
|
||||
final BigDecimal lBigDecimal = objectToBigDecimal(l, null);
|
||||
final BigDecimal rBigDecimal = objectToBigDecimal(r, null);
|
||||
final BigDecimal lBigDecimal = objectToBigDecimal(l, null, false);
|
||||
final BigDecimal rBigDecimal = objectToBigDecimal(r, null, false);
|
||||
if (lBigDecimal == null || rBigDecimal == null) {
|
||||
return false;
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ public class JSONObjectTest {
|
||||
|
||||
assertTrue("Should eval to true", obj1.similar(obj4));
|
||||
|
||||
// verify that a double and big decimal are "similar"
|
||||
assertTrue("should eval to true",new JSONObject().put("a",1.1d).similar(new JSONObject("{\"a\":1.1}")));
|
||||
|
||||
}
|
||||
@ -942,7 +943,7 @@ public class JSONObjectTest {
|
||||
assertTrue("-0 Should be a Double!",JSONObject.stringToValue("-0") instanceof Double);
|
||||
assertTrue("-0.0 Should be a Double!",JSONObject.stringToValue("-0.0") instanceof Double);
|
||||
assertTrue("'-' Should be a String!",JSONObject.stringToValue("-") instanceof String);
|
||||
assertTrue( "0.2 should be a Double!",
|
||||
assertTrue( "0.2 should be a BigDecimal!",
|
||||
JSONObject.stringToValue( "0.2" ) instanceof BigDecimal );
|
||||
assertTrue( "Doubles should be BigDecimal, even when incorrectly converting floats!",
|
||||
JSONObject.stringToValue( new Double( "0.2f" ).toString() ) instanceof BigDecimal );
|
||||
|
Loading…
x
Reference in New Issue
Block a user