如何获取Java中小数点后的部分?

时间:2012-01-17 06:17:19

标签: java

我有一个double变量d = 1.15

我想要小数点后的数字,即" 15"。

在Java中实现这一目标的最佳方法是什么?

我试过这样的话:

Double d = 1.15;
String str = d.toString();
int len = str.substring(str.indexOf(".")).length() - 1;
int i= (int) (d * (long)Math.pow(10,len) % (long)Math.pow(10,len));

但我没有得到正确的答案,因为当我转换d.toString()时答案是14.999999999999986

15 个答案:

答案 0 :(得分:15)

试试这个,

String numberD = String.valueOf(d);
        numberD = numberD.substring ( numberD.indexOf ( "." ) );

现在这个numberD变量的值为15

答案 1 :(得分:9)

尝试Math.floor();

double d = 4.24;
System.out.println( d - Math.floor( d )); 

要防止舍入错误,您可以将它们转换为BigDecimal

    double d = 4.24;
    BigDecimal bd = new BigDecimal( d - Math.floor( d ));
    bd = bd.setScale(4,RoundingMode.HALF_DOWN);
    System.out.println( bd.toString() );

打印0.2400

请注意,setScale中的4是小数点分隔符后面的位数('。')

要将余数作为整数值,您可以将其修改为

BigDecimal bd = new BigDecimal(( d - Math.floor( d )) * 100 );
bd = bd.setScale(4,RoundingMode.HALF_DOWN);
System.out.println( bd.intValue() );

打印24

答案 2 :(得分:6)

小数点后的数字不是明确定义的概念。例如,对于“4.24”,它可以是“0.24”,“0.239999999999”(或类似),“24”或“239999999999”。

如果你在谈论一个数字或一串十进制数字......以及输入值是否是二进制浮点数的表示(在这种情况下“4.24”很可能是近似值),你需要清楚)十进制浮点数。

根据您的解释,正确答案会有所不同。


  

但我没有得到正确答案,因为当我转换d.toString()时,答案是14.999999999999986。

您正在遇到doublefloat是base-2浮点格式的问题,并且在大多数情况下,它们不能精确地表示十进制浮点数。除了使用BigDecimal之类的东西来表示你的数字之外,没有任何解决办法。 (即使这样,只要你进行除法或模运算,就有可能失去一些精度。)

答案 3 :(得分:2)

如果您的双人是:

d = 1.25;

如果你这样做:

String number = String.valueOf(d);

number = number.substring(number.indexOf(".")).substring(1);

然后number将为25

我不知道这是否是最好的方法,但它确实有效。

答案 4 :(得分:1)

如果您想要小数位,并且想要对结果进行舍入。

double d = 4.24;
System.out.printf("%0.2f%n", d - (long) d);

打印

0.24

如果你想要一个舍入值,你必须确定你想要的精度。

double d = 4.24;
double fract = d - (long) d;
fract = (long) (fract * 1e9 + 0.5) / 1e9; // round to the 9 decimal places.

答案 5 :(得分:1)

尝试使用RegEx,此处为^\d*\.,将搜索数字后跟点并替换为空白。

for(double d : new double[]{1.15,0.009,222.9,3.67434}){
    System.out.println(String.valueOf(d).replaceAll("^\\d*\\.",""));
}

给出:

15
009
9
67434

答案 6 :(得分:0)

就像在任何其他语言中一样:乘以10并在除以10时检查残余的int部分。与从整数中提取数字的方法相同。


short[] digits = new short[max_len];
double tmp = d - ((int) d);
for (int i = 0; i < digits.length && tmp != 0; i++)
{
  tmp *= 10;
  digit[i] = (short) tmp;
  tmp -= (int) tmp;
}

但请注意,对于double,您需要引入精度限制 - 要提取的最大位数(上面的代码示例中的max_len)。

轻微更新(在精度边缘添加舍入):

double d = 1.15;
        short[] digits = new short[10];
        double tmp = d - ((int) d) + 0.5 * 1e-10;
        for (int i = 0; i < digits.length && tmp != 0; i++)
        {
            tmp *= 10;
            digits[i] = (short) tmp;
            tmp -= (int) tmp;
        }

答案 7 :(得分:0)

你试过d = d%1.0吗?这应该将d除以1的余数返回,这应该只是小数部分。

您也可以这样做以将值作为int:d = (int)((d%1.0)*100)

答案 8 :(得分:0)

代替d.toString(),试试这个:

String str = String.format("%.2f", d);

答案 9 :(得分:0)

    double d = 4.24;
    d = (d - Math.floor( d ));
    int e = (int)(Math.round(d*100));
    System.out.println(e);

收益率24

答案 10 :(得分:0)

  Scanner scr= new Scanner (System.in);
  double d= scr.nextDouble();

  BigDecimal bc= new BigDecimal ((d - Math.floor(d))*1e5); 

  bc=bc.setScale(4,RoundingMode.HALF_DOWN); 

  double f = bc.doubleValue();

    while(f%10==0)
    {
      f=f/10;
    }
  System.out.println(f);

答案 11 :(得分:-1)

尝试:

double d = 1.1512;

int i = (int) (d*100 - Math.floor(d)*100);

现在,这会给您:15

答案 12 :(得分:-1)

    ExAMPLE :

    Double d = 469.951479;

    String string = d.toString();

    char[] len = string.substring(string.indexOf(".")).toCharArray();

    System.out.println(len);

答案 13 :(得分:-1)

double myNumber = 1.15;
//numbers After Dot
double n = 2;
double right_of_dot = (myNumber - (int) myNumber)*Math.pow(10,n);

答案 14 :(得分:-3)

尝试一下:

var decimalsOnly = (parseFloat(decNum)-parseInt(decNum,10)).toFoxed(2);