2013-03-07 3 views
2

반올림 숫자가있는 Android 애플리케이션에 문제가 있습니다. Java로 계산할 때는 BigDecimal을 사용합니다. 그러나이 방법이 도움이됩니다. 그러나 우리는 SQLite에 문제가 있습니다.Android sqllite 반올림 오류

SELECT ROUND(150.075 * 100)/100 (= 150.07, not 150.08!) 

임의의 먹었습니까?

+2

http://www.sqlite.org/faq.html#q16 – Selvin

+0

@Selvin 예, 알고 있습니다. 가능하면 해결 방법을 찾으십시오. – ekstro

+0

int로 데이터를 저장 ... 150075처럼 ... 자바 코드에서 BigDecimal (150075, 3)을 사용하십시오 – Selvin

답변

0

부동 소수점 부정확으로 인해 150.075 * 10015007.5과 같지 않기 때문입니다. 배정 밀도 부동 소수점에서 150.075의 십진수 표현은 150.07499999999999999722444243843711입니다.

는 소수 자릿수를 지정할 수 있습니다 ROUND()의 2 인자 버전을 사용하는 사용자가 원하는 동작을 얻으려면 :

이 (우아한되지 않음) 솔루션에 대해 어떻게 생각
sqlite> SELECT ROUND(150.075, 2); 
150.08 
+0

불행히도, 이것은 좋은 해결책이 아닙니다. 안드로이드 SQLite (하지만 구글 크롬에서도) SELECT ROUND (150.075, 2)는 150.07을 반환합니다. 우리는 때로는 하나의 숫자가 OSX에서는 올바르 며 Windows에서는 잘못된 것임을 알아 냈습니다. 그 반대의 경우도 있습니다. – ekstro

+1

@ekstro 내부적으로 sqlite는 자체 'printf()'를 사용하여 반올림하고 일부 버전은 비슷한 부동 소수점 부정확성을 갖습니다. – laalto

1

:

SELECT ROUND(150.075 + 0.00000000000009, 2) (= 150.08) 

우리는 5 000 개 이상의 잘못된 값을 검사하여 효과가 있습니다.