PHP не поддерживает двойное

#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.