【问题标题】:How to split the values after decimal points?如何拆分小数点后的值?
【发布时间】:2017-04-25 07:37:29
【问题描述】:

我无法拆分小数点后的十进制值,我使用 split 尝试了一些可能的答案,但无法实现。请建议一些可能的解决方案来实现这一点

纬度:13.8989989988

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

【问题讨论】:

  • 我使用 split 尝试了一些可能的答案,但它无法实现 请显示您在那里尝试过的内容。如果这是一个数字,那么你只需要减去这个值的整数部分(得到一个近似值,因为浮点值不精确)

标签: java android split decimal


【解决方案1】:

您想要一个带有后视功能的正则表达式

"13.8989989988".split("(?<=\\.\\d{3})");

这样的结果是一个包含"13.898""9989988" 的数组。

这里的正则表达式的意思是“前面有一个点和三个数字的空字符串”,它给你你想要的匹配。

【讨论】:

  • 基于现有问题,尚不清楚该变量是否甚至是字符串
  • 我很乐意为你投票,但我尽量不推广正则表达式答案,因为有足够多的帖子。 OP没有足够的搜索。 (当然与你无关)
  • 好点,我想她总能把它变成一个字符串
【解决方案2】:

您可以使用Math.floor 将这两个部分作为数值获取:

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

详细说明

根据 Dawoods 对此答案的评论,这可能不是最好的方法。尽管如此,这里还是对正在发生的事情进行了更详细的解释。

作为一般规则,在 Java 中使用 double 处理小数是不好的 主意。如果你要在算术上做这种操作 (而不是像我的回答那样使用 String ),那么最好的策略是 总是使用 BigDecimal 类。永远不要期望双重行为 像小数一样。 — 达伍德·伊本·卡里姆

获取第一部分
将小数点向左移动所需的小数长度,然后floor 并将小数点向后移动。

double lat = 13.898998995;
double step1 = lat * 1e3; // 13898.998995
double step2 = Math.floor(step1) // 13898.0
double step3 = step2 / 1e3 // 13.898

获取第二部分
我们像获取第一部分一样移动小数点,但使用ceilfloor 的组合来防止舍入问题。这就是为什么我们将小数点多移动一点。

double step1 = lat - part1; // 0.000998995 = the rest

// number length of 6 + we already got 3 decimals + 2 decimals for rounding up, then down
// 1e6 + 1e3 + 1e2 = 1e11
double step2 = Math.ceil(step1) * 1e11; // 00099899500.0
double step3 = Math.floor(step2 / 1e2); // 000998995.0

【讨论】:

  • 好点@DawoodibnKareem - 谢谢!我更新了我的答案。你对此满意吗? ;-)
  • 伙计,你现在真的抓住了我。
  • 我同意。已经赞成您的回答,但认为这也可能是其他人的起点。我至少会用一些解释来更新我的答案。
  • 希望看到BigDecimal 方法,@DawoodibnKareem。我也更新了答案。希望你被引用没问题。 ;-)
  • 好吧,我已经让你为此付出了很大的努力,但这里(最后)是我的赞成票。
【解决方案3】:
    double lat=13.8989989988;
    double seperated = Math.floor(lat*100.0)/100.0;
    System.out.println(seperated);
    System.out.println(lat-seperated);

【讨论】:

  • 你试过了吗?我想结果可能会让你大吃一惊。
  • 13.89 --- 第一次打印 0.008998998799999214 -- 第二次
【解决方案4】:

对于那些更喜欢算术解决方案而不是字符串操作的人,我提供以下内容。

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 来存储小数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多