我有一个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
。
答案 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。
您正在遇到double
和float
是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);