如何通过一个浮点数,用整数获取每个数字。Java

3

有没有好的方法可以搜索一个浮点数的前四个数字,并使用int[]分别返回每个数字?

例如:浮点数23.51变成整数数组,array[0]=2,array[1]=3,array[2]=5,最后是array[3]=1

我的代码:

public void printNumber(float number){
    String string = String.valueOf(number);
    while(!numbers.isEmpty()){
        numbers.remove(0);
    }
    for(int i = 0; i < string.length(); i++) {
        int j = Character.digit(string.charAt(i), 10);
        this.number = new Number(j);
        numbers.add(this.number);
        System.out.println("digit: " + j);
    }
}

我应该提到的是,Number是一个类,它只根据构造函数所赋的数字和数字本身返回不同的图片。

numbers是一个ArrayList。


3
对于二进制,"浮点数的前四个数字"没有明确定义。 - chrylis -cautiouslyoptimistic-
这是否意味着它无法完成? - Viktor Lindblad
3
将其转换为带有格式说明符的字符串,然后迭代遍历字符串元素? - OldProgrammer
我已经尝试过了,但没有成功,也许我的代码有问题,所以我会把它贴在上面。 - Viktor Lindblad
你的浮点数有几位小数精度? - MaxZoom
只需要前四个。 - Viktor Lindblad
5个回答

5

float 使用定点格式转换为 String,然后逐个遍历其字符并忽略小数点。

如果这个数也可能是负数,在 String 输出中要注意符号:

float v = 23.51F;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(8);
char[] d = df.format(v).toCharArray();
int count = 0;
for (int i = 0 ; i != d.length ; i++) {
    if (Character.isDigit(d[i])) {
        count++;
    }
}
int[] res = new int[count];
int pos = 0;
for (int i = 0 ; i != d.length ; i++) {
    if (Character.isDigit(d[i])) {
        res[pos++] = Character.digit(d[i], 10);
    }
}

演示。

重要提示:请注意,float类型数据天生就不够精确,因此可能会出现一两个“偏差”数字。例如,你的例子会产生:

[2 3 5 1 0 0 0 0 2 3]

在结尾处有数字23

1
提示:为避免 float 出现不准确的情况,即在末尾引入无关的额外数字,请使用 BigDecimal 对象代替 floatdouble 原始类型来表示小数。 - Basil Bourque
@BasilBourque 绝对没错,BigDecimal 可以解决这个问题。但是,首先需要有 BigDecimal。如果你从 floatdouble 构造它,问题又回来了;如果你从 String 开始,可以完全跳过 BigDecimal - Sergey Kalinichenko

1
你可以使用 String.format 方法将 float 转换为带有 4 位小数的 String,然后将每个字符转换为 int 数组。
float floatValue = 12.34567f;
String str = String.format("%.4f", floatValue);
// remove the minus, dot, or comma (used in some countries)
str = str.replaceAll("[-|.|,]", "");
int [] nums  = new int[str.length()];
for (int i=0; i<str.length(); i++) {
  nums [i] = str.charAt(i) - '0';
}

这里是演示

至于代码的最后一行,将数字字符的十进制值减去“0”字符(其值为48),结果就是该数字的整数值(如下表所示):
输入图像描述


1
Java 8风格的解决方案:
float number = -7.54f;
int[] digits = String.format("%.3f", number)
                     .chars()
                     .filter(Character::isDigit)
                     .limit(4L)
                     .map(Character::getNumericValue)
                     .toArray();

System.out.println(Arrays.toString(digits)); //=> [7, 5, 4, 0]

如果能够解释一下回答有什么问题的话,我会很高兴的。 - beatngu13

0
使用静态方法 Float.toString() 将您的 float 转换为字符串。
然后遍历每个字符并使用 Integer.parseInt() 返回一个 int。
public void printNumber(float number){
    String string = Float.toString(number);

    for(int i = 0; i < string.length(); i++) {
        int j = Integer.parseInt(string.charAt(i));
        this.number = new Number(j);
        numbers.add(this.number);
        System.out.println("digit: " + j);
    }
}

0

另一个选择

public static void main(String[] args) {

   float number = 23.51f;
   String strNumber = String.valueOf(number).replaceAll("\\D", "");
   int[] arrNumber = new int[strNumber.length()];

   for (int pos = 0; pos < strNumber.length(); ++pos) {
        arrNumber[pos] = Integer.valueOf(String.valueOf(strNumber.charAt(pos)));
        System.out.println(arrNumber[pos]);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接