我无法分割小数点后的小数值,我尝试使用拆分来解决一些可能的答案但是无法实现。请建议一些可能的解决方案实现此目的
纬度:13.8989989988
我需要的解决方案是: 13.898 ,其余值 998998 分开
答案 0 :(得分:5)
你想要一个带有后视的正则表达式
"13.8989989988".split("(?<=\\.\\d{3})");
结果是包含"13.898"
和"9989988"
的数组。
这里的正则表达式表示&#34;空字符串前面有一个点和三个数字&#34;,它为您提供所需的匹配。
答案 1 :(得分:1)
您可以使用require
:
Math.floor
根据Dawoods对此答案的评论,这可能不是最好的方法。不过,这里有更详细的解释。
作为一般规则,在Java中使用double来处理小数是一件坏事 理念。如果您打算在算术上进行这种操作 (而不是像我的回答那样使用String),那么最好的策略是 总是要使用BigDecimal类。永远不要指望双重行为 像小数。 - Dawood ibn Kareem
获得第一部分
将小数点向左移动所需的小数点长度,然后移动double lat = 13.8989989988;
double part1 = Math.floor(lat * 1e3) / 1e3; // 13.898
double part2 = Math.floor(Math.ceil((lat - part1) * 1e11) / 1e2) // 998998.0
并移回小数点。
floor
获取第二部分
我们像获取第一部分一样移动小数点,但使用double lat = 13.898998995;
double step1 = lat * 1e3; // 13898.998995
double step2 = Math.floor(step1) // 13898.0
double step3 = step2 / 1e3 // 13.898
和ceil
的组合来防止舍入问题。这就是为什么我们更多地移动小数点。
floor
答案 2 :(得分:0)
double lat=13.8989989988;
double seperated = Math.floor(lat*100.0)/100.0;
System.out.println(seperated);
System.out.println(lat-seperated);
答案 3 :(得分:0)
对于那些更喜欢算术解决方案而不是字符串操作的人,我提供以下内容。
BigDecimal original = new BigDecimal("13.898998998");
BigDecimal part1 = original.setScale(3, RoundingMode.FLOOR);
BigInteger part2 = original.subtract(part1).unscaledValue();
System.out.println(part1 + ", " + part2); // prints 13.898, 998998
这甚至会在原始字符串中保留尾随零。
这里重要的是这些数字是小数,因此不应存储在float
或double
中。如果您不想遭受舍入错误,请始终使用BigDecimal
来存储小数。