2011-05-04 58 views
0

我写了一个函数,它给出了PHP和Java中的差异输出。请帮我在PHP中获取相同的输出。下面是用这两种语言编写的函数。PHP不支持double

功能在Java中:

public String getLat(String v_str, String strNS){ 
    try 
    {    
     double lat = Integer.parseInt(v_str.substring(0, 2)); 
     //System.out.println("lat="+lat); 
     double lat2 = Float.parseFloat(v_str.substring(2)); 
     lat2 = lat2*10000; 
     lat2 = lat2/60*10000; 
     lat2 = lat2/100000000; 
     //System.out.println("lat2="+lat2); 
     lat += lat2; 

     if(strNS.equals("S")) 
      return ("-"+lat); 
     else 
      return (""+lat); 
    } 
    catch(Exception e){} 

    return (""); 
} 

电话:getLat("5224.09960","N");

输出:

$deg_coord = '5224.09960'; 

$lat = (int)(substr($deg_coord,0,2)); 
$lat2 = (substr($deg_coord,2)); 

$lat2 = $lat2*10000; 
$lat2 = $lat2/60*10000; 
$lat2 = $lat2/100000000; 
echo $lat += $lat2; 
exit; 

输出:52.40166

在PHP 52.40165999730428

功能10

+1

使用'Double.parseDouble( str)'而不是'double lat = Integer.parseInt(“11.4”); double lat2 = Float.parseFloat(“11.2”);' – 2011-05-04 10:03:06

+0

我想在PHP中输出相同的输出结果 – Jimit 2011-05-04 10:03:54

+0

尝试'printf(“%。16f”,$ lat)'而不是'echo' ... – 2011-05-04 10:06:17

回答

2

由于舍入错误,您的Java答案看起来不正确。这可能是因为你使用Float而不是Double,因为float的精度要比double多得多。

public static void main(String[] args) { 
    System.out.println(getLat("5224.09960","N")); 
} 

public static double getLat(String v_str, String strNS) { 
    double lat = Integer.parseInt(v_str.substring(0, 2)); 
    double lat2 = Double.parseDouble(v_str.substring(2)); 
    lat += lat2/60; 
    return strNS.equals("S") ? -lat : lat; 
} 

打印

52.40166 

我怀疑使用字符串操作是不安全如纬度从0开始。即,它仅发生于数字与在小数点前4位数字工作。

此代码不对数字位数作出任何假设。 (它假定要舍入到小数点后6位)

public static double getLat(String v_str, String strNS) { 
    double v = Double.parseDouble(v_str); 
    double lat = ((long) v)/100; 
    double lat2 = (v - lat * 100)/60; 
    double lat3 = lat + lat2; 
    double rounded = (double)(long) (lat3 * 1000000 + 0.5)/1000000; 
    return strNS.equals("S") ? -rounded : rounded; 
} 

如果你想重现PHP同舍入误差,你可以尝试

$deg_coord = '5224.09960'; 

$lat = (int)(substr($deg_coord,0,2)); 
$lat2 = (float) (substr($deg_coord,2)); 

$lat2 = $lat2*10000; 
$lat2 = $lat2/60*10000; 
$lat2 = $lat2/100000000; 
echo $lat += $lat2; 
exit; 
+0

不,我想输出与PHP中的JAVA相同 – Jimit 2011-05-04 10:22:36

+3

您想重现相同的舍入错误吗?这是疯了。但是,请参阅我的编辑。顺便说一句,正如我所指出的,大约有一半的代码没有做任何事情,并且在低于1000纬度的情况下不起作用。 – 2011-05-04 10:23:36