Я пытаюсь преобразовать двойное значение, например. 12.55
в BigDecimal
с этим кодом:Как правильно преобразовать BigDecimal в десятичный?
BigDecimal unitPrice = new BigDecimal(product.getUnitPrice());
В результате я получил что-то вроде этого 12.550000000000000710542735760100185871124267578125
тогда я должен закругленный его с этим кодом:
unitPrice.setScale(2, RoundingMode.HALF_EVEN)
и получил результат, как это 12.55
это нормально. Тем не менее, когда я собираюсь установить это в качестве параметра для вставки в базу данных MySQL с этим кодом:
addProduct.setBigDecimal(4, unitPrice.setScale(2, RoundingMode.HALF_EVEN));
Так что, когда я бегу, я получил эту SQL Ошибка:
Data truncation: Out of range value for column 'price_per_unit' at row 2
Я знаю, что проблема была в этом коде:
addProduct.setBigDecimal(4, unitPrice.setScale(2, RoundingMode.HALF_EVEN));
, как я отлажена его в этой строке кода, значение было
12.550000000000000710542735760100185871124267578125
тип данных столбца в MySQL, который я поставил был DECIMAL(3,2)
.
Почему он не работает, даже когда я его закруглял? Я попытался найти решение и не могу найти что-либо релевантное. Как вы действительно правильно определили десятичную дробь? Я предполагаю, что вы знаете, что я пытаюсь сделать. Заранее спасибо.
Почему 'product.getUnitPrice()' вернуть значение с плавающей точкой? Это настоящая проблема. – EJP
@EJP Он возвращает двойной фактически. –
['double' * is * floating-point] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3) на самом деле, и это все еще настоящая проблема. Вам не нужно округлять, чтобы хранить в базе данных. Не используйте с плавающей точкой деньги. – EJP