2012-06-16 2 views
2

일부 데이터를 데이터베이스에 저장하고 그 데이터를 커서로 읽습니다. 모든 데이터는 56.45, 3.04, 0.03 유형이므로 소수점 이하 두 자리 숫자입니다.Android 숫자 형식이 어쨌든 3.5 대신 3.499999999가 표시됩니다. 이유는 무엇입니까?

sum+= c.getDouble(4) * multi 

다 1과 100 사이의 정수 지금이다 : 지금은 그것들을 요약하고 싶지만 쉽게 될 것 같지 않습니다 ... 나는 그 때 내가 좋아 합 변수에 추가 c.getDouble(3)와 그 번호를 내 문제는 그 합계를 얻은 후 같은 번호를 얻을 : 59.51999999999999999. 코드를 게시하지는 않지만 위젯에 숫자를 표시하기위한 string.valueOf 이외의 변환은 없습니다. 그래서 아무도 이것을 경험하지 않았습니까? 내가 계산할 때 59.52가되어야하지만 대신 99999로 그 숫자를 얻습니다 ... 왜 그런 일이 일어나고 있습니까? (Math.round()와 함께 작동하지 않는 재밌는 점은 (합계) * 100/100을 설정하더라도 59.0이됩니다.

+0

이 사이트를 살펴 보자 나는 이유는이 [링크] (대한 생각 http://floating-point-gui.de/ –

+0

을 http://stackoverflow.com/questions/5384601/java-doubles-are-not-at-math/5385202 # 5385202) 도움이 될 수 있습니다. 우리는 최선의 해결책을 찾을 때까지 시도 할 수있는 해결책이 있습니다. –

답변

2

다른 접근 방식으로 sum 변수를 double으로 정의한 다음 sum 변수에 NumberFormat을 설정할 수 있습니다.

예 :

double sum = 21.2015; 
NumberFormat formatter = new DecimalFormat("#.##"); 
formatter.format(sum); 
9

숫자는 10 진수로 표시되지만 컴퓨터는 2 진수로 표시됩니다. . 진수와 바이너리 모두에서

, 일부 분수 당신은 단지 0.3333333333 같은과에 근접 할 수있다. 정확하게 진수로 표시 할 수없는 예를 1/3를 들어

. 정확하게 표시 할 수 없습니다. 그런데 당신이하려고하면 3 * 0.3333333333 일 경우 1.0000000000 대신 0.9999999999가됩니다.

바이너리에서는 동일한 문제가 있지만 분수가 다릅니다.

가끔 십진수에서 이진수로 다시 변환 할 때 (컴퓨터가 기본적으로 부동 소수점 산술을 수행해야하는 작업), 모든 숫자가 완벽하게 정확하더라도 작은 오류가 발생합니다. 소수. 컴퓨터가 바이너리 근사치를 사용할 때 근사값이 도입되고 오차가 작아집니다.

이것은 실제로 프로그래밍에서 매우 일반적인 문제입니다. 더 자세한 내용은 What Every Computer Scientist Should Know About Floating-Point Arithmetic을 참조하십시오.

관련 문제