#java #php
#java #php
Вопрос:
Я написал одну функцию, которая выдает разницу, помещенную в PHP и Java. Пожалуйста, помогите мне получить такой же результат и в PHP. ниже приведены функции, написанные на обоих языках.
Функция в 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");
Вывод: 52.40165999730428
Функция в PHP:
$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
Комментарии:
1. используйте
Double.parseDouble(str)
вместоdouble lat = Integer.parseInt("11.4"); double lat2 = Float.parseFloat("11.2");
2. Я хочу такой же вывод в PHP man..
3. Попробуйте
printf("%.16f", $lat)
вместоecho
…4. @Jimit, вывод в PHP выглядит более корректным.
5. @Jimit, разница в том, что оба ответа имеют разную ошибку округления. Правильный ответ — 52.40166.
Ответ №1:
Похоже, что ваш ответ 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;
Комментарии:
1. Нет, я хочу, чтобы вывод был таким же, как JAVA в PHP
2. Вы хотите воспроизвести ту же ошибку округления? Это безумие. Однако, смотрите мою правку. Кстати, как я уже отмечал, примерно половина вашего кода ничего не делает и не будет работать на широтах меньше 1000.