О двойной и большой десятичной точности - PullRequest
0 голосов
/ 12 декабря 2018

В сети есть странная проблема, но ее невозможно воспроизвести в автономном режиме.

Конкретная проблема заключается в следующем: значение, хранящееся в базе данных, равно 107,4, тип десятичный, значение взятоmybatis, тип java, настроенный mybatis, является двойным

Следующая инструкция:

BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()

Возвращает:

10739

Локально проверено, результат всегда:

10740

Как это можно решить?

1 Ответ

0 голосов
/ 12 декабря 2018

Если значение принимается за double, то значение 107.4 в компьютере уже будет иметь ошибку аппроксимации, поскольку значения с плавающей запятой представляют собой конечную сумму (отрицательных) степеней 2.

Теперьвопросы округления, fp-strict и другие, но лучше устранить причину и использовать BigDecimal вместо double.Обратите внимание, что new BigDecimal(107.4) не будет делать, только new BigDecimal("107.4") или исправление точности / масштаба самостоятельно.

double value = 107.4; // Might actually be more like 107.39999987.
BigDecimal x = new BigDecimal(value).setScale(1, BigDecimal.ROUND_HALF_UP);

Где масштаб 1 соответствует определению столбца базы данных.

...