Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将双精度数组转换为整数数组_Java_Arrays_Type Conversion_Int_Double - Fatal编程技术网

Java 将双精度数组转换为整数数组

Java 将双精度数组转换为整数数组,java,arrays,type-conversion,int,double,Java,Arrays,Type Conversion,Int,Double,我有双人房 double pi = 3.1415; 我想把它转换成整数数组 int[] piArray = {3,1,4,1,5}; 我想到了这个 double pi = 3.1415; String piString = Double.toString(pi).replace(".", ""); int[] piArray = new int[piString.length()]; for (int i = 0; i <= piString.length()-1; i++) p

我有双人房

double pi = 3.1415;
我想把它转换成整数数组

int[] piArray = {3,1,4,1,5};
我想到了这个

double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
   piArray[i] = piString.charAt(i) - '0'; 
double pi=3.1415;
字符串piString=Double.toString(pi.replace(“.”,”);
int[]piArray=new int[piString.length()];

对于(int i=0;i我不知道直路,但我认为它更简单:

int[] piArray = String.valueOf(pi)
                      .replaceAll("\\D", "")
                      .chars()
                      .map(Character::getNumericValue)
                      .toArray();
或者使用
java-9
更安全的方法:

 int[] result = new Scanner(String.valueOf(pi))
            .findAll(Pattern.compile("\\d"))
            .map(MatchResult::group)
            .mapToInt(Integer::valueOf)
            .toArray();
您可以在Java8中使用

int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
这也会起作用

int[] piArray = piString.chars().map(c -> c-'0').toArray();

由于您希望避免强制转换,假设您只需要处理正数,下面是算术方法:

List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
    int mostSignificantDigit = (int) current;
    piList.add(mostSignificantDigit);
    current = (current - mostSignificantDigit) * 10;
}
List piList=new ArrayList();
双电流=π;
而(当前>0){
int mostSignificantDigit=(int)当前值;
piList.add(最重要的数字);
电流=(电流-最大重要位数)*10;
}
通过先检查符号,然后使用与
current=Math.abs(pi)
相同的代码,可以轻松地处理负数

请注意,由于浮点运算,它将为您提供无法用二进制完美表示的值可能无法预期的结果


这是一个说明问题的ideone,您可以在其中尝试我的代码。

此解决方案不做任何假设,而是使用字符串操作来获得所需的结果。获取双精度,将其转换为字符串,删除非法字符,然后将剩余的每个字符强制转换为整数,并按其顺序存储在数组中替身

        double pi           = 3.1415;
        String temp         = ""+ pi;
        String str          = "";
        String validChars   = "0123456789";

        //this removes all non digit characters 
        //so '.' and '+' and '-' same as string replace(this withThat)
        for(int i =0; i<temp.length(); i++){
          if(validChars.indexOf(temp.charAt(i)) > -1 ){
              str = str +temp.charAt(i);
          }
        }

        int[] result = new int[str.length()];

        for(int i =0; i<str.length(); i++){
          result[i] = Integer.parseInt(""+str.charAt(i));
          System.out.print(result[i]);
        }

        return result; //your array of ints
double pi=3.1415;
字符串temp=”“+pi;
字符串str=“”;
字符串validChars=“0123456789”;
//这将删除所有非数字字符
//所以“.”和“+”和“-”与字符串替换相同(this替换为that)
对于(int i=0;i-1){
str=str+温度特征(i);
}
}
int[]结果=新的int[str.length()];

对于(int i=0;我使用了相同的解决方案,您稍早:)我使用了
replaceAll(\\D“,”)
很难过滤任何非数字。Glains发布您的解决方案或编辑,因为我认为这是更稳健的解决方案。@Eugene如果double是1.13E+21 replaceFirst,则
BigDecimal.valueOf(pi).toPlainString()不起作用
完全避免了指数形式。您可能对以2为基数的数字感兴趣,这是一个0和1的双精度数组。双精度类具有位的转换。在上面的示例中,您可以在数组中使用10的幂:-4。双精度本身是有问题的,因为toString可以给出“3.1414999998”考虑过写一个Java 7的答案,但它似乎毫无意义。一个foreach的
piString.toCharArray
和使用
Character::getNumericValue
是我唯一要做的更改。编辑:仍然需要int数组的索引…如果数字很大,会发生什么?我的意思是:如果一个数字的字符串表示形式是
1E200
您希望数组变成
{1,2,0,0}
还是
{1,0,0,0,…,0}
带有200个零?您希望得到什么答案(比如)
double d=0.1
?由于浮点骗局,这绝非小事。此外,为什么您认为数据类型之间的转换会导致错误?-最后,对于未来,这样的问题更适合。如果我们了解您为什么这样做,我们可能会给出一个更有意义的答案。您会怎么做e如何处理生成的数组?你能解释一下为什么它更安全吗?我对此很感兴趣。我不相信这是唯一一个提到浮点表示的答案。+1虽然算术方法很好,但浮点表示不精确的问题使得它对真实世界的数字毫无用处。当
3.1415
生成一个包含52个值的
列表(3、1、4、1、5、一堆零,然后是无用的垃圾“精度”),你有点违反了用户的期望。@ShadowRanger是的,绝对同意。我“记得”在测试我的解决方案时出现浮点精度问题,并且认为我的答案仍然会引起兴趣(特别是如果是家庭作业,在这种情况下,如果这个问题是老师希望学生遇到的,我不会感到惊讶).通过使用
BigDecimal
,现实世界中的算术解决方案仍然是可能的,但我不确定它是否比基于字符串的解决方案有很多优势solutions@Aaron:是的。如果值以
double
的形式到达,那么在转换为
BigDecimal
BigDecimal
double
保留二进制浮点值的精确十进制表示形式,因此
BigDecimal
唯一的帮助方法是将输入类型更改为
BigDecimal
(将问题推给调用者),或通过字符串转换执行隐式舍入(这只是隐藏了一个事实,即所有这些都有效地基于字符串解析)。您的答案没有错(不是否决投票),它可能只对演示有用。@ShadowRanger字符串解决方案基本上也有这个问题;它不太明显,因为字符串格式化程序已经为它提供了一些处理,但它仍然存在。在某种程度上,字符串解决方案只是更好地隐藏了一个潜在的错误,这通常不是一个好主意。
        double pi           = 3.1415;
        String temp         = ""+ pi;
        String str          = "";
        String validChars   = "0123456789";

        //this removes all non digit characters 
        //so '.' and '+' and '-' same as string replace(this withThat)
        for(int i =0; i<temp.length(); i++){
          if(validChars.indexOf(temp.charAt(i)) > -1 ){
              str = str +temp.charAt(i);
          }
        }

        int[] result = new int[str.length()];

        for(int i =0; i<str.length(); i++){
          result[i] = Integer.parseInt(""+str.charAt(i));
          System.out.print(result[i]);
        }

        return result; //your array of ints