gpt4 book ai didi

java - 从十进制度转换为六十进制度

转载 作者:行者123 更新时间:2023-12-01 17:22:00 25 4
gpt4 key购买 nike

我们正在做以下练习:Sexagesimal degree 。我们想要转换十进制输入,例如

lat: 48.858222
lon: 2.2945

六十进制结果为:

48° 51′ 30″ N, 2° 17′ 40″ E

我们编写了以下代码:

import java.util.*;
public class SexagesimalDegree {

/**
* Convert WGS84-Coordinates from decimal degrees in sexagesimal degrees
*
* @param lat Latitute as Double
* @param lon Longtitute as Double
* @return String "%d° %d′ %d″ %s, %d° %d′ %d″ %s" (lat_degree, lat_minute, lat_second, lat_direction,
* lon_degree, lon_minute, lon_second, lon_direction)
* @throws Exception
*/
public static String convert /*🌐🌐🌐*/ (double lat, double lon) throws Exception {
System.out.println("lat: "+lat);
System.out.println("lon: "+lon);
String[] latSplitted = String.valueOf(lat).split("\\.");
String[] lonSplitted = String.valueOf(lon).split("\\.");
System.out.println("latSplitted: "+Arrays.toString(latSplitted));
System.out.println("lonSplitted: "+Arrays.toString(lonSplitted));
String latHours = latSplitted[0];
String lonHours = lonSplitted[0];
System.out.println("latHours: "+latHours);
System.out.println("lonHours: "+lonHours);

double latMinutesNumber = Double.parseDouble(latSplitted[1])*60;
double lonMinutesNumber = Double.parseDouble(lonSplitted[1])*60;
System.out.println("latMinutesNumber: "+latMinutesNumber);
System.out.println("lonMinutesNumber: "+lonMinutesNumber);


String latMinutes = String.valueOf((int)(latMinutesNumber)).substring(0,2);
String lonMinutes = String.valueOf((int)(lonMinutesNumber)).substring(0,2);
System.out.println("latMinutes: "+latMinutes);
System.out.println("lonMinutes: "+lonMinutes);

String latDecimalPart = "0"+String.valueOf(latMinutesNumber).substring(String.valueOf(latMinutesNumber).indexOf("."));
String lonDecimalPart = "0"+String.valueOf(lonMinutesNumber).substring(String.valueOf(lonMinutesNumber).indexOf("."));
System.out.println("latDecimalPart: "+latDecimalPart);
System.out.println("lonDecimalPart: "+lonDecimalPart);

System.out.println("Double.parseDouble(latDecimalPart): "+Double.parseDouble(latDecimalPart));

double remainingLatSeconds = Integer.parseInt(latMinutes)-Double.parseDouble(latDecimalPart);
System.out.println("remainingLatSeconds: "+remainingLatSeconds);

return "";
}
}

输出以下结果:

lat: 48.858222
lon: 2.2945
latSplitted: [48, 858222]
lonSplitted: [2, 2945]
latHours: 48
lonHours: 2
latMinutesNumber: 5.149332E7
lonMinutesNumber: 176700.0
latMinutes: 51
lonMinutes: 17
latDecimalPart: 0.149332E7
lonDecimalPart: 0.0
Double.parseDouble(latDecimalPart): 1493320.0
remainingLatSeconds: -1493269.0

正如您所注意到的,我们能够按预期获得小时和分钟。然而,当我们努力争取秒数时,谜题就出现了。我们需要从纬度获取小数部分:0.1493327E7,从分钟获取小数部分:0.6700。

但是,我们得到的纬度为 0.149332E7,经度为 0.0。疑问是:如何得到剩下的小数,并计算秒数?

为了能够调试它,我们已阅读:

https://www.thoughtco.com/decimal-degrees-conversion-1434592
https://stackoverflow.com/questions/36474338/converting-string-to-double-with-dotç
https://stackoverflow.com/questions/5769669/convert-string-to-double-in-java
https://stackoverflow.com/questions/27480633/converting-from-string-to-double?noredirect=1&lq=1

总而言之,我们如何在计算分钟后计算剩余的小数,从而能够得到秒?

最佳答案

首先将度数转换为整数秒,而不是处理字符串。

double latDegrees = 48.858222;
int latSeconds = (int) Math.round(latDegrees * 60 * 60); // = 175890

现在您可以使用简单的整数算术来梳理出各个部分。

int seconds = latSeconds % 60; // = 30
int minutes = (latSeconds / 60) % 60; // = 51
int degrees = (latSeconds / 60) / 60; // = 48

这是一种替代方法,如果您不熟悉模运算符 %,它可能更容易理解:

double latDegreesWithFraction = 48.858222;
int degrees = (int) latDegreesWithFraction; // = 48

double fractionalDegrees = latDegrees - degrees; // = .858222
double minutesWithFraction = 60 * fractionalDegrees; // = 51.49332
int minutes = (int) minutesWithFraction; // = 51

double fractionalMinutes = minutesWithFraction - minutes; // = .49332
double secondsWithFraction = 60 * fractionalMinutes; // = 29.6
int seconds = (int) Math.round(secondsWithFraction); // = 30

关于java - 从十进制度转换为六十进制度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61276512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com