Я устанавливаю масштаб и округляем десятичные числа для данных в json, используя Big Deciaml.
Пример данных внутри json:
{"dataMap":{"DATE":"20071.0","mean":"20225.08483315143","ByGroup":"Mean"}
Код для установки масштаба, округления и заменыисходное число с новым -
//body - JSON body as String
//rndNumber - scale OR digits required after dedcimal
private static String roundDecimalNumbers(def body, int rndNumber)
{
def ids = body =~ /[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?/
String number
double dblNumber
BigDecimal dec
double newNumber
(0..<ids.count).each
{
number = ids[it].toString()
dec = new BigDecimal(String.valueOf(number)).setScale(rndNumber, BigDecimal.ROUND_FLOOR).stripTrailingZeros()
body = body.toString().replace(number, dec.toString()) //replacing the orignial number with the scaled and rounded number
}
return body.toString()
}
Для некоторых случаев десятичных чисел я получаю исключение, как показано ниже, например, для приведенных выше примеров данных я получаю ошибку -
java.lang.AssertionError: data [rowNumber = 4] .dataMap.data [rowNumber = 97] .dataMap.mean Ожидаемое: 202258483315145 получено: 202258483315143
Другое похожее исключение - вызвано: java.lang.AssertionError: data[rowNumber = 2] .dataMap.data [rowNumber = 73] .dataMap.lower1 Ожидаемый: -354402976665825 получил: -354402976665821
В то же время большинство чисел масштабируются, округляются и заменяютсяштрафа в том же JSON, как -
{"dataMap":{"DATE":"19854","mean":"21778.4088","ByGroup":"Mean"},"rowNumber":66},{"dataMap":{"DATE":"19861","mean":"21547.0865","ByGroup":"Mean"},"rowNumber":67}
Я не могу понять, почему есть проблемы с некоторыми конкретными числами.Пожалуйста, помогите.