数据修约规则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");
    }
测试:

结果:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值