You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java代码问题:如何正确提取并输出输入浮点数小数点后前三位数字

提取小数点后前三位数字的正确实现

需求说明

输入一个double类型数值,输出小数点后的前三位数字,数字之间用空格分隔。

示例运行

请输入一个十进制数:
67.3424
输出:3 4 2

现有错误代码

Scanner scan = new Scanner(System.in);
System.out.print("Please input a decimal number: ");
double hit_n = scan.nextDouble();

double hit_4 = hit_n % 10;
hit_n /= 10;
double hit_3 = hit_n % 10;
hit_n /= 10;
double hit_2 = hit_n % 10;
hit_n /= 10;
double hit_1 = hit_n % 10;

System.out.println(hit_1);
System.out.println(hit_2);
System.out.println(hit_3);
System.out.println(hit_4);

代码问题分析

当前代码逻辑完全错误:它用取模%和除以10的操作,本质是在提取整数部分的数位,和小数部分完全不相关。再加上double类型的浮点精度特性,取模结果会附带多余的小数位,根本没法正确提取目标的小数点后前三位数字。

正确实现方案

方案1:字符串处理(最稳妥,规避精度坑)

直接将输入转为字符串,分割出小数部分后取前三位,不足的补0:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入一个十进制数:");
        String input = scan.nextLine();
        
        // 按小数点分割整数和小数部分
        String[] parts = input.split("\\.");
        if (parts.length < 2) {
            // 无小数部分时输出三个0
            System.out.println("0 0 0");
            scan.close();
            return;
        }
        
        String decimalPart = parts[1];
        StringBuilder result = new StringBuilder();
        // 取前三位,位数不够则补0
        for (int i = 0; i < 3; i++) {
            result.append(i < decimalPart.length() ? decimalPart.charAt(i) : '0');
            if (i != 2) {
                result.append(' ');
            }
        }
        
        System.out.println(result);
        scan.close();
    }
}

方案2:数学运算处理(适合精确小数场景)

通过乘法将小数部分转为整数,拆分数位时用Math.round降低精度误差:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入一个十进制数:");
        double num = scan.nextDouble();
        
        // 提取小数部分,乘1000后取整,减少精度偏差
        long decimalNum = Math.round((num - (long) num) * 1000);
        
        // 拆分出每一位数字
        int first = (int) (decimalNum / 100);
        int second = (int) ((decimalNum / 10) % 10);
        int third = (int) (decimalNum % 10);
        
        System.out.printf("%d %d %d%n", first, second, third);
        scan.close();
    }
}

方案说明

  • 字符串处理方案更可靠,因为double类型的二进制浮点特性,像0.1这类数值无法精确存储,数学运算容易出现误差,直接操作字符串能彻底规避这个问题。
  • 数学运算方案适合确定输入为精确小数的场景,Math.round可以将精度误差降到最低。

内容的提问来源于stack exchange,提问作者oh my god

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:42