数据修约规则02

要求:

        1、输入几位保留几位
        2、保留的有效位数后一位有数字直接进位
        3、结果保留科学计数法

代码:
    /**
     * 格式化数字,保留指定位数,如果下一位是非零数字则向上取整。
     *
     * @param data 要格式化的数字
     * @param numberCnt 总位数(包括整数和小数部分)
     * @return 格式化后的字符串
     */
    public static String formatNumber(double data, int numberCnt) {
        BigDecimal bd = new BigDecimal(data);
        // 如果totalDigits小于或等于0,直接返回原数
        if (numberCnt <= 0) {
            return Double.toString(data);
        }
        // 计算整数部分的位数
        int integerPartLength = bd.precision() - bd.scale();
        // 如果需要保留的位数小于或等于整数部分的位数,只处理整数部分
        if (numberCnt <= integerPartLength) {
            int shift = integerPartLength - numberCnt;
            bd = bd.setScale(-shift, RoundingMode.UP);
        } else {
            // 否则,保持整数部分不变,只处理小数部分
            int decimalPlaces = numberCnt - integerPartLength;
            bd = bd.setScale(decimalPlaces, RoundingMode.UP);
        }
        // 格式化并返回数字
        String plainString = bd.toPlainString();
        DecimalFormat df = new DecimalFormat();
        // 构建科学记数法的模式字符串
        StringBuilder pattern = new StringBuilder("0.");
        for (int i = 0; i < numberCnt - 1; i++) {
            pattern.append("0");
        }
        pattern.append("E0");
        // 应用模式字符串
        df.applyPattern(pattern.toString());
        // 格式化数字并返回
        String scientificString = df.format(Double.parseDouble(plainString));
        // 拆分科学记数法字符串
        String[] parts = scientificString.split("E");
        if (parts.length != 2) {
            throw new IllegalArgumentException("Invalid scientific notation: " + scientificString);
        }

        // 解析系数和指数
        String coefficient = parts[0];
        int exponent = Integer.parseInt(parts[1]);
        String end;
        // 处理正负号
        if (exponent >= 0) {
            end =  "+" + exponent;
        } else {
            end =  String.valueOf(exponent);
        }
        // 构造带有 "x10^" 的格式化字符串
        String result =  coefficient + "x10^" + end;
        return  result.replace(".x","x");
    }
测试:

结果:

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-12 11:38:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-12 11:38:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-12 11:38:04       82 阅读
  4. Python语言-面向对象

    2024-06-12 11:38:04       91 阅读

热门阅读

  1. 服务器硬件基础知识

    2024-06-12 11:38:04       26 阅读
  2. Linux基础命令

    2024-06-12 11:38:04       23 阅读
  3. 大数据知识分享:Python中的变量

    2024-06-12 11:38:04       28 阅读
  4. 力扣981.基于时间的键值存储

    2024-06-12 11:38:04       27 阅读
  5. 【rust 第三方库】serde 序列化反序列化框架

    2024-06-12 11:38:04       27 阅读
  6. 分布式系统

    2024-06-12 11:38:04       24 阅读
  7. Python语言在金融领域的应用探索

    2024-06-12 11:38:04       25 阅读
  8. Thymeleaf 2升级到Tymeleaf 3导致Layout不起作用

    2024-06-12 11:38:04       22 阅读
  9. Android单例的几种实现方式

    2024-06-12 11:38:04       29 阅读
  10. idea自动生成单元测试工具

    2024-06-12 11:38:04       30 阅读
  11. linux中sed命令和awk命令如何使用??????

    2024-06-12 11:38:04       29 阅读
  12. Django里的模板变量

    2024-06-12 11:38:04       27 阅读
  13. SQL题——连续问题

    2024-06-12 11:38:04       19 阅读