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
相关产品推荐
相关产品推荐

