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

在Java中,如何获取小数点后的部分?,java,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)); 但是我没有得到正确的答案,因为当我转

我有一个
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.9999999999986

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


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;
}

短[]位=新短[最大长度];
双tmp=d-((int)d);
对于(int i=0;i
但是请注意,对于double,您需要引入精度限制—要提取的最大位数(上面代码示例中的max_len)

轻微更新(在精度边缘添加圆角):

double d=1.15;
短[]位=新短[10];
双tmp=d-((int)d)+0.5*1e-10;
对于(int i=0;i}
您是否尝试过
d=d%1.0
?这将返回d除以1的余数,这应该只是小数部分

您也可以这样做以int形式获取值:
d=(int)((d%1.0)*100)
试试这个

String numberD = String.valueOf(d);
        numberD = numberD.substring ( numberD.indexOf ( "." ) );
现在这个numberD变量的值为15,试试Math.floor()

为了防止舍入错误,可以将它们转换为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.23999999999”(或类似)、“24”或“23999999999”

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

根据你的理解,正确答案会有所不同


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


您遇到的问题是,
double
float
是基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.toString()

String str = String.format("%.2f", d);
如果您的替身是:

d = 1.25;
如果你这样做:

String number = String.valueOf(d);

number = number.substring(number.indexOf(".")).substring(1);
然后
number
将是
25


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

试试正则表达式,这里是
^\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
试试这个:

double d = 1.1512;

int i = (int) (d*100 - Math.floor(d)*100);
现在这将给你:15

    ExAMPLE :

    Double d = 469.951479;

    String string = d.toString();

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

    System.out.println(len);
产量24

试试这个:

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

这个问题给我提供了很多信息——我知道有多少人没有真正运行他们发布的代码,或者没有真正阅读这个问题。问题是如何从
1.15
获取
15
。到目前为止,只有Arjun解决了这个问题,因为他看到了这个问题的本质:一个字符串解析问题。仅仅因为海报尝试使用数学并不意味着答案必须遵循相同的路径。@Paul-我想说OP的最后一个(否定的)例子给了这个理论一个谎言。如果这只是一个字符串解析问题,那么OP会很高兴以“9999999986”作为答案…@StephenC,你从哪里得到的?他说他想要
15
作为答案(他的帖子的第二行),他的代码给了他
14.9999…
。将问题从数字改为文本,问题仍然是一样的:给定一个字符串
abc.def
,他如何提取
def
?您的解决方案的一个问题是
0.1
0.01
0.000001
都会导致
1
。我起初也不确定它会这样做,但读完这篇文章后,我很确定它是真的,除非我看错了。哇,这真是一个有趣的功能。很好,我知道了。谢谢。对我来说,它和其他任何东西一样清晰,尽管这可能是因为我更习惯这种风格。虽然添加注释来解释这样的一行并没有什么坏处。-1我这样运行了您的第一行:
double d=1.15;d=d%1.0;System.out.println(“d=“+d”)输出为
d=0.1499999999999
。我运行了你的第2位代码,得到了
d=14.0
,两者都不接近他要找的
15
。我运行了你的代码,得到了
0.2400000000000002
-我认为他不会觉得这有帮助。所有这些重复,你不能测试你的代码D@Paul谢谢修复了它,这是一个IEEE 754表示,他只需要对值进行四舍五入。@PeterLawrey,当然,我听说过这些。告诉我这与海报只想得到小数点后的部分有什么关系,例如,斯塔克的例子是
24
。@stacker,你如何将
0.2400000000000002
四舍五入到
24
?@Paul我不清楚要求,我添加了一个四舍五入到.24的例子,以及另一个24的例子。我希望它现在清楚了。+1,它很简单,答案不必是数学的。将其视为
字符串
问题可消除pr的问题
    ExAMPLE :

    Double d = 469.951479;

    String string = d.toString();

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

    System.out.println(len);
double myNumber = 1.15;
//numbers After Dot
double n = 2;
double right_of_dot = (myNumber - (int) myNumber)*Math.pow(10,n);
    double d = 4.24;
    d = (d - Math.floor( d ));
    int e = (int)(Math.round(d*100));
    System.out.println(e);
var decimalsOnly = (parseFloat(decNum)-parseInt(decNum,10)).toFoxed(2);