删除小数中除前两个数字以外的所有数字

Removing all but the first two numbers in a decimal

我正在尝试制作一个程序,将用户输入的数字转换为百分比。转换后,我想保留小数点后的前两个数字,但不对数字进行四舍五入。例如,输入 1.23456 将得到 123.45.

我的想法是,我可以接受输入,将字符串分成小数点前后,然后创建一个循环,删除最后一位数字,直到它最多保留 2 位小数。我的问题是,每当我创建小数点输出大于 9 的东西时,我都会收到错误消息:线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:开始 0,结束 -1,长度 0,所以我可以暂时只取小数到小数点后的小数点。

我的代码:

import java.util.Scanner;
public class percentage {

public static void main(String[] args) {
    try (// TODO Auto-generated method stub
    Scanner x = new Scanner(System.in)) {
        System.out.println("Please input a number with a decimal to be converted into a percentage: ");
        String numberAsString = x.next();
        double number = Double.parseDouble(numberAsString);
        
        double percentage = (number * 100);         
        
        String toString = Double.toString(percentage);
        
        String[] parts = toString.split("[.]");
        
        String integer = parts[0];
        String decimal = parts[1];
        
        int length = decimal.length();

        while(length>2) {
            decimal = decimal.substring(0,decimal.length()-1);
        }
        System.out.println("decimal is " + decimal);
        System.out.println("integer is " + integer);
        }
        //System.out.println(decimal);
        
    } 
}

乘以 10,000(百分比为 100,小数点后两位为 100),截断为整数,除以 100(返回百分比)。

一次一步写出来,为了阐述清楚:

Double n = input.nextDouble();
int i = (int)(n * 10_000);
Double pc = i / 100.0;
System.out.printf("%.2f\n", pc);

您在变量 toString 中将数字作为字符串。使用正则表达式 trim 2nd 小数点后的所有字符(如果存在)。

这是一个 one-liner:

toString = toString.replaceAll("(?<=\...).*", "");

或者直接打印出来:

System.out.println(toString.replaceAll("(?<=\...).*", ""));