【问题标题】:How to leave only 4 decimals after number bigger than 0?如何在大于 0 的数字后只留下 4 位小数?
【发布时间】:2021-10-08 16:07:24
【问题描述】:

我不知道如何解释好,但例如我有一个数字: 0.00000548347554 并想从中制作0.000005483,或者 0.06834532480.06843

【问题讨论】:

  • 我会说转换为字符串,开始遍历,直到在点后找到一个非零,然后再计算另外四个字符。然后用substring 切到那里。我想不出用计算或标准库中的东西来做这件事的方法。
  • 我不知道有任何功能提供此功能。也许使用黑客方法。

标签: java


【解决方案1】:

这假设你的号码是一个字符串:

String tmp = "0.0683453248";

String[] tmpA = tmp.split("");
ArrayList<String> res = new ArrayList<>();

for(int i = 0; i < tmpA.length; i++){
    res.add(tmpA[i]);

    if(!tmpA[i].equals(".") && Integer.parseInt(tmpA[i]) > 0){
        res.add(tmpA[i + 1]);
        res.add(tmpA[i + 2]);
        res.add(tmpA[i + 3]);
        break;
    }

}

String result = String.join("",res);

【讨论】:

    【解决方案2】:

    使用solution from this answer,您可以将给定的数字转换为字符串,然后使用正则表达式替换从中取出所需的字符串。

    演示:

    import java.text.DecimalFormat;
    import java.text.DecimalFormatSymbols;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            // Test
            System.out.println(doubleToString(0.00000548347554));
            System.out.println(doubleToString(0.0683453248));
        }
    
        static String doubleToString(double n) {
            DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
            df.setMaximumFractionDigits(340);
            return df.format(n).replaceAll("(\\d*\\.0*[1-9]{4})\\d*", "$1");
        }
    }
    

    输出:

    0.000005483
    0.06834
    

    ONLINE DEMO

    正则表达式的解释

    • (: 开始捕获组#1
      • \\d*\\.:数字后跟.
      • 0*:任意数量的零
      • [1-9]{4}:非零四位数字
    • ): 捕获组#1 结束
    • \d*:任意数字任意次数

    【讨论】:

      【解决方案3】:

      对于小数字可以使用BigDecimal

      BigDecimal significant(double number, int count) {
          if (count < 1) 
              throw new IllegalArgumentException("invalid count: " + count);
          BigDecimal big = BigDecimal.valueOf(number);
          if (big.precision() <= count) {
              return big;
          } else {
              return big.setScale(big.scale()-big.precision()+count, RoundingMode.HALF_EVEN);
          }
      }
      

      precision() 返回有效位数;
      该方法更改了比例,因此仅存在所需的位数。
      如果输入的数字少于count,则if 用于避免比输入更多的零。

      如果需要,使用doubleValue() 将结果转换为double(可能遭受舍入错误)。
      要获取字符串,请使用toPlainString(),它将不使用指数符号将结果转换为字符串。

      如果需要,还可以更改舍入模式。

      注意:它也可以用于更大的数字,它基本上会将数字替换为零,如significant(12345,2) -> 12000(或1.2E+4

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 2010-11-20
        • 2020-09-11
        • 2022-01-23
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-12
        相关资源
        最近更新 更多