如何在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。
您正在遇到double
和float
是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