如何在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

尝试这个,

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

现在这个numberD变量的值为24

试试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

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

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

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


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

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

如果你想要小数位,你想要舍入结果。

 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. 

如果您的双倍是:

 d = 1.25; 

如果你这样做:

 String number = String.valueOf(d); number = number.substring(number.indexOf(".")).substring(1); 

那么number将是25

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

试试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 

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

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

而不是d.toString() ,试试这个:

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

就像在任何其他语言中一样:乘以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; } 

尝试这个 :

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

现在这会给你:15