如何在Java中通过点将双精度数字拆分为两个小数?

4

想将一个双精度浮点数按照小数点分为两部分,如:1.9 分为 1 和 9;0.16 分为 0 和 16;

这是我的方法,但似乎有些冗余,有更好的方法吗?

原始数字总是像0.x或1.x或0.xx或1.xx,其中xx > 10。

    double d = 1.9;
    int a, b;
    String dString = Double.toString(d);
    String aString = dString.substring(0, 1);

    String bString = dString.substring(2);
    a = Integer.parseInt(aString);
    b = Integer.parseInt(bString);

我这样做似乎使用了太多的字符串转换,我认为这不是很高效的。


2
你可以使用 String.split(".")。 - Marco
当给定数字为1.11.011.001等时,您期望得到什么结果? - ntalbs
3
@Marco: 你的意思是 String.split("\\.") - Keppil
@ntalbs,在我的情况中没有这样的数字。只有0.x或1.x或0.xx或1.xx,其中xx>10。 - Johnny Chen
@Keppil:你是正确的! - Marco
11个回答

16

你也可以尝试这种方法

    double val=1.9;
    String[] arr=String.valueOf(val).split("\\.");
    int[] intArr=new int[2];
    intArr[0]=Integer.parseInt(arr[0]); // 1
    intArr[1]=Integer.parseInt(arr[1]); // 9

@Rucbira.. 我不太清楚 split("\\.") 部分.. split(".") 部分不足以吗? - Kidus Tekeste
1
@KidusTekeste 请参考:https://dev59.com/b2Uq5IYBdhLWcg3wC8Lx。如果要在一个字面上的点上进行分割,您需要转义这个点。 - frianH
1
是的,我已经检查过了,现在明白了。谢谢 @frianH - Kidus Tekeste

4
您可以将double类型视为字符串,在小数点位置进行分割。
     double d = 13454.92345;
     String bob = Double.toString(d);
     String[] convert = bob.split("\\.");

     int a = Integer.parseInt(convert[0]);
     int b = Integer.parseInt(convert[1]);

     System.out.println(a); // 13454
     System.out.println(b); // 92345

2

将小数部分作为int获取并不真正遵循任何标准,因此您需要使用特殊的解决方案。然而,获取小数点前的值可以简化为一个简单的强制转换:

double d = 1.9;
int a, b;
String dString = Double.toString(d);
String bString = dString.substring(2);
a = (int) d;
b = Integer.parseInt(bString);

请注意,如果数字大于或等于10,则substring()parseInt()会失败。您可能需要将substring()调用更改为以下内容:
String bString = dString.split("\\.")[1];

1
double num=12.5;
String str=Double.toString(num);
String strarray[]=str.split("\\.");

现在strarray[0]将持有12,而strarray[1]则为5。您可以通过编写以下代码将它们转换为整数:
int num1=Integer.parseInt(strarray[0]);
int num2=Integer.parseInt(strarray[1]);

确保你使用"\."来分割句点。 - tudoricc

1
这是一个两行版本:
int a = (int)d;
int b = Integer.parseInt((d + "").split("\\.", 2)[1]).replaceAll("^$", "0"));

第一部分很容易 - 只需将其转换为 int,这会自动截取数字的任何小数部分。

第二部分最简单的方法是使用字符串方法 - 在点上拆分字符串版本并使用第二个部分。请注意添加""以生成字符串,并处理没有小数部分的边缘情况,其中3作为双精度打印为3.-如果结果为空白(由split的第二个参数保证),则将其转换为零。


1
  double d = 1.9;
  String str = Double.toString(d);
  String strArray[] = str.split("\\.");

  int a = Integer.parseInt(strArray[0]);
  int b = Integer.parseInt(strArray[1]);
  System.out.print(a + " - " + b);

尝试一下。这会起作用。

0

这里有另一种方法:

double d=1.9;
int a;
int b;

a = (int) d/10;
b = (int) d%10;

System.out.print("a");
System.out.print("b");

0
    double dub=1234.5678987;//Variable to be manipulated
    long lon=0; //To store before decimal point.    
    short sh=0;//To store after decimal point.  
    int deci=10000; //to 4 decimal places   
    lon=(int)dub;// get the integer part of the number stored in long   
    sh=(short)((dub-(double)lon)*deci);//deci to required decimal places.
    System.out.println(""+lon+"."+sh);

0

这个解决方案适用于几乎任何小数部分的长度,而且不使用字符串。例如,被接受的答案对于0.16无效。

double d = 123.456

long a = (long) d;
double f = d - a;

while (Math.abs((long) f - f) > 0.000001) f *= 10;

long b = (long) f;

// a = 123
// b = 345

@JrChen 嗯,以前它不起作用,现在它使用 String 代替。 - Patrik Oldsberg

0
我已经将@Ruchira Gayan Ranaweera提供的答案代码进行了重构,转换成了一个Java方法,您可以轻松地将其整合到您的开发中:
public class Post24753336 {
    public static int[] splitDoubleByDot(double val) {
        String[] arr=String.valueOf(val).split("\\.");
        int[] intArr=new int[2];
        intArr[0]=Integer.parseInt(arr[0]);
        intArr[1]=Integer.parseInt(arr[1]);
        return intArr;
    }
}

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