如何拆分小数点后的值?

时间:2017-04-25 07:37:30

标签: java android split decimal

我无法分割小数点后的小数值,我尝试使用拆分来解决一些可能的答案但是无法实现。请建议一些可能的解决方案实现此目的

纬度:13.8989989988

我需要的解决方案是: 13.898 ,其余值 998998 分开

4 个答案:

答案 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

这甚至会在原始字符串中保留尾随零。

这里重要的是这些数字是小数,因此不应存储在floatdouble中。如果您不想遭受舍入错误,请始终使用BigDecimal来存储小数。