2016-06-09 3 views
-1

Я пытаюсь преобразовать двойное значение, например. 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).

Почему он не работает, даже когда я его закруглял? Я попытался найти решение и не могу найти что-либо релевантное. Как вы действительно правильно определили десятичную дробь? Я предполагаю, что вы знаете, что я пытаюсь сделать. Заранее спасибо.

+0

Почему 'product.getUnitPrice()' вернуть значение с плавающей точкой? Это настоящая проблема. – EJP

+0

@EJP Он возвращает двойной фактически. –

+1

['double' * is * floating-point] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3) на самом деле, и это все еще настоящая проблема. Вам не нужно округлять, чтобы хранить в базе данных. Не используйте с плавающей точкой деньги. – EJP

ответ

3

Decimal (3,2) означает, что номер имеет три цифры, один слева и два справа. 12.55 не вписывается в это. Было ли у вас намерение хранить три влево? Было бы decimal(5,2)

+0

О да ... Вы правы ... Почему я не понял этого? Большое спасибо Томасу. Это было простое решение. лол :) –

0

от того, если вы хотите сохранить DECIMAL (3,2) код будет

new BigDecimal(12.55f, new MathContext(3, RoundingMode.HALF_EVEN)).setScale(2);