2012-06-13 1 views
3

У меня разные столбцы в базе данных. Я использую ormlite, и я выполняю SQL с genericRawResults. Мой код выглядит так:Потерянная точность при выборе столбцов с расчетами под Android

GenericRawResults<Total> rawResults = 
    dao.queryRaw("select items*3 from Items", new RawRowMapper<Total>() { 
     public Total mapRow(String[] columnNames, 
      String[] resultColumns) throws SQLException { 
        return new Total(new BigDecimal(resultColumns[0])); 
     } 
     }); 

В результате получается число, потерявшее десятичные знаки. Зачем?

Я пытаюсь использовать cast (имя столбца как REAL), но результат тот же. Что я могу сделать? Благодарю.

+0

Можете ли вы показать свою схему и можете ли вы показать результат строки, который вы собираетесь отображать? – Gray

+0

Моя схема:
CREATE TABLE Items ('factory' VARCHAR NOT NULL, 'd1' VARCHAR NOT NULL, 'd2' VARCHAR NOT NULL, 'id' INTEGER NOT NULL, 'цена' VARCHAR NOT NULL, 'item' INTEGER PRIMARY KEY AUTOINCREMENT)
MARM

ответ

0

Я нашел решение !!!!! Я конвертировать Real в Varchar так:

select id, factory, cast(SUM(Round((cast(Round((cast(price as REAL))*(cast((100-d1)/cast(100 as REAL) as REAL)),3) as REAL))* (cast((100-2)/cast(100 as REAL) as REAL)),3)* cast(units as REAL)) as VARCHAR) from Items group by id, factory

И я не теряю десятичные !!!!

0

Трудно точно узнать, что здесь происходит, не видя схемы Sqlite и не видя String результат item*3.

Я подозреваю, что это не проблема с ORMLite. Я подозреваю, что это ограничение Sqlite в том, что он использует небольшую точность для внутренних расчетов. Вот пример из Sqlite командной строки:

select 11312541243231.01*3; 
33937623729693.0 // << note the missing .03 

Я хотел бы предложить, что вы не сделать *3 в запросе, а сделать умножение после она была преобразована в BigDecimal. Я думаю, что-то вроде:

BigDecimal big = new BigDecimal(resultColumns[0]); 
big.multiply(new BigDecimal(3)); 
+0

Я подумал о том, чтобы умножить свой результат в конце, но у меня много строк, и мне нужно добавить разные строки и для каждой строки умножить на число. Это очень медленно. Sql выглядит следующим образом: 'select id, factory, SUM (cast (Round ((Round ((cast ((100-d1)/cast (100 как REAL) как REAL) * цена), 3)) * (cast ((100-d2)/литье (100 как REAL) как REAL)), 3) * cast (единицы как REAL) как REAL)) из группы Items по id, factory' Я пытаюсь умножить на 10000 и после деления на 10000 но проблема сохраняется. Например, если у меня есть _169,794 * 1000 * 12/1000 = 2037,53_. Но правильно: _2037,528_ – MARM

+0

Не намного больше я могу сказать @MARM. Sqlite делает арифметику, и она выглядит ограниченной по точности. – Gray

+0

Доброта! Ну, я рад, что он работает. – Gray

Смежные вопросы