2012-01-09 2 views
0

데이터베이스에 field float 유형의 값이 0.0 인 필드 반경이 있습니다. 32.422에 내가이 문으로, 그것은 D2의 내용 값의 변경 sript PHP를 통해SQL UPDATE 및 SET with float numbers

:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` + ".$d2." WHERE `index` = '".$index."'"); 

나는 같은 양으로 반경의 값을 줄이기 위해 다른 PHP 스크립트를 사용하여 나중에 경우 :

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` - ".$d2." WHERE `index` = '".$index."'"); 

최종 값은 0이 아니지만 1.4988E-9 ... 거의 0입니다.

아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까?

감사합니다, Direz 아무 문제가 없습니다

+0

당신은 더 나은'대신 float''의 double' 사용합니다. – a1ex07

답변

1

, 당신은 단지 부동 소수점 숫자의 한계를 seing하고 있습니다.

당신이 생각하는 정확한 값은 32.422가 아닙니다. 쿼리의 텍스트 표현에서 데이터베이스에서 사용하는 부동 소수점 숫자로 변환 될 때 해당 데이터 형식을 사용하여 표현할 수있는 가장 가까운 숫자가됩니다. 그것은 32.421999995662와 유사 할 수 있습니다. 정확히 32.422에 가깝지만 정확하게는 아닙니다.

각 부동 소수점 값에는 의도 한 값과의 편차가 포함될 수 있으며 계산을 할 때 편차가 합산되고 잠시 후에 차이가 나타납니다.

일반적으로 작은 차이는 표시 할 때 숫자가 적당한 자릿수로 반올림되므로 표시되지 않습니다. 예를 들어 두 번째 쿼리에서 31.422를 뺀 경우 1에 매우 가까운 값으로 끝나야합니다 (예 : 1.00000000014988). 표시 할 때 1.000000000으로 반올림됩니다. 0에 가까운 값을 얻으므로 반올림 할 수있는 편차보다 큰 값이 없으므로 편차 만 표시됩니다.

+0

귀하의 훌륭한 설명 주셔서 감사합니다! –