public function gcj_decrypt_exact($gcjLat, $gcjLon) {
		$initDelta = 0.01;
		$threshold = 0.000000001;
		$dLat = $initDelta; $dLon = $initDelta;
		$mLat = $gcjLat - $dLat; $mLon = $gcjLon - $dLon;
		$pLat = $gcjLat + $dLat; $pLon = $gcjLon + $dLon;
		$wgsLat = 0; $wgsLon = 0; $i = 0;
		while (TRUE) {
			$wgsLat = ($mLat + $pLat) / 2;
			$wgsLon = ($mLon + $pLon) / 2;
			$tmp = $this->gcj_encrypt($wgsLat, $wgsLon);
			$dLat = $tmp['lat'] - $gcjLat;
			$dLon = $tmp['lon'] - $gcjLon;
			if ((abs($dLat) < $threshold) && (abs($dLon) < $threshold))
				break;

			if ($dLat > 0) $pLat = $wgsLat; else $mLat = $wgsLat;
			if ($dLon > 0) $pLon = $wgsLon; else $mLon = $wgsLon;

			if (++$i > 10000) break;
		}
		//console.log(i);
		return array('lat' => $wgsLat, 'lon'=> $wgsLon);
	}