2012-06-13 12 views
3

데이터베이스에 다른 열이 있습니다. 나는 ormlite를 사용하고 genericRawResults으로 SQL을 실행한다. 내 코드는 다음과 같습니다.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])); 
     } 
     }); 

결과는 소수점 이하 자릿수입니다. 왜?

캐스팅 (REAL로 columnname 사용)을 시도하지만 결과는 같습니다. 내가 무엇을 할 수 있을지? 감사.

+0

스키마를 표시 할 수 있으며 매핑중인 문자열 결과를 표시 할 수 있습니까? – Gray

+0

내 스키마 :
CREATE TABLE 항목 ('factory' VARCHAR NOT NULL, 'd1'VARCHAR NOT NULL, 'd2'VARCHAR NOT NULL, 'ID'INTEGER NOT NULL, 'price'VARCHAR NOT NULL, 'item'INTEGER PRIMARY KEY AUTOINCREMENT)
MARM

답변

0

나는 해결책을 찾았다 !!!!!

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

그리고 소수 손실되지 않습니다 !! :이 같은 대 Varchar로 실시간 변환

0

결과가 item*3이 아닌 상태에서 Sqlite 스키마를 보지 않으면 무엇이 잘못되었는지 알기가 어렵습니다.

그러나 이것은 ORMLite에서는 문제가되지 않는다고 생각합니다. 나는 이것이 내부 계산을 수행하기 위해 작은 정밀도를 사용한다는 점에서 Sqlite의 한계라고 생각한다. 당신이 하지이 쿼리에 *3을 할 수 있지만,이 BigDecimal로 변환 된 후 오히려 곱셈을 수행하는 것이

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

내가 제안 : 여기에 SQLite는 명령 줄에서 예입니다. 나는 다음과 같이 추측한다 :

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

끝에 결과를 곱하려고 생각했지만 많은 행이 있고 다른 행을 추가해야하고 각 행에 대해 숫자로 곱해야합니다. 아주 천천히. sql은 다음과 같습니다.'select id, factory, SUM (cast (Round ((Round ((REAL)) * price), 3)) * ((cast ((100-d1) REAL과 같은 캐스팅 (REAL로 단위를 REAL로)), ID별로 항목 그룹에서 '10000을 곱하려고합니다. 10000으로 나누면 (100-d2)/캐스트 (REAL은 100으로 REAL) 그러나 문제는 지속됩니다. 예를 들어 _169,794 * 1000 * 12/1000 = 2037,53_이있는 경우 그러나 올바른 것은 다음과 같습니다. _2037,528_ – MARM

+0

그 외에는 @MARM을 말할 수 있습니다. Sqlite는 산술 연산을 수행하고 있으며 정밀도가 제한적으로 보입니다. – Gray

+0

맙소사! 글쎄, 나는 그것이 효과적이기 때문에 기쁘다. – Gray

관련 문제