双精度浮点数中的小数位数

42

在Java中如何确定类似于234.12413的数字有多少个整数位和小数位。


1
可能重复:https://dev59.com/MFfUa4cB1Zd3GeqPFCrw#5993212 - amit
一个应用程序可能需要知道哪些功能,才能显示“Double”或“Float”以仅显示一定限度的精度。例如,“12.158384”->“12.16”,“3.33333..”->“3.33”。 - Andrew Thompson
一个双精度浮点数中没有十进制数字,只有二进制数字。 - user207421
另一种看待它的方式是:在英特尔平台上,一个double 双精度浮点数,在硬件级别上实际是一个52位整数。还有11位数字告诉你小数点应该放在哪里。再加上一个符号位。 - Vagrant
3
与使用字符串转换相比,我更推荐这种方法。 BigDecimal value = BigDecimal.valueOf(<double_value>); int decimalCount = Math.max(0, value.scale()); - elifekiz
显示剩余2条评论
4个回答

57

double并不总是精确的表示方式。只有当你将其转换为字符串时,才能确定它有多少位小数。

double d= 234.12413;
String text = Double.toString(Math.abs(d));
int integerPlaces = text.indexOf('.');
int decimalPlaces = text.length() - integerPlaces - 1;

这种方法只适用于没有转换成指数符号的数字。你可以认为1.0有一位或零位小数。


1
BigDecimal在指数较大时更有用。总之,这是一个很好的例子,所以+1。 - sunleo
5
这种方法最终会失败,因为转换 toString() 使用操作系统的小数分隔符,而不是所有操作系统都使用点 . 作为小数分隔符,而你正在使用字面上的点,因此它只能在某些环境和某些情况下工作。更好的方法是使用:new DecimalFormat("#.#########").format(Math.abs(value)).replace(",",".") 来确保你的 text 变量始终接收到一个字面上的点。 - Joe Almore
1
此外,对于以零结尾的大数,它也无法正常工作,因为10000000被表示为1.0E7等。因此,result[0] = 1,result[1] = 3。可以使用DecimalFormat解决这个问题。同样的问题也可以用toString()"" + doubleValue的方式解决。 - Fenix
3
这是一个不错的答案,但不可靠,因为它不能适用于所有的双精度数。我能够使用数学方法解决这个问题,通过循环计算10的幂,并检查dbl * pow(10, i) % 1 == 0是否为真来确定小数位数 i。如果该语句为真,则小数位数为i。在方法开始处添加一个条件判断,检查双精度数是否没有小数部分:if(dbl == (int)dbl) {return 0;}即可完成该方法。 - Ian S.
4
你的解决方案存在反例,就像 Fenix 所说的那样,比如 10,000,000。使用 Double.toString(10000000) 可以得到 1.0E7。但是,如果你按照我的方法运行这个数字,那么 10000000.0D * Math.pow(10, 0) % 1 == 0 将会是真的,并且函数将返回0。很遗憾,每个评论中的字符不足以容纳该方法的完整实现。(我已经修改了该方法,所以顶部没有if语句了。) - Ian S.
显示剩余10条评论

22
Double d = 234.12413;
String[] splitter = d.toString().split("\\.");
splitter[0].length();   // Before Decimal Count
splitter[1].length();   // After  Decimal Count

@ Peter Lawrey:这里应该是 Double 而不是小写的 double,注意 D ouble 的大小写。 - Seega
1
decimalno=dstring.length()-(dstring.indexOf(".")+1); - zacharia
如果 \\. 正则表达式无法工作,请尝试使用 [.]。这对我起作用了。 - cpinamtz

10
    String s = "" + 234.12413;
    String[] result = s.split("\\.");
    System.out.println(result[0].length() + " " + result[1].length());

3

1) 转换为字符串

2) 从“.”开始截取到结尾

3) 获取该子字符串的长度


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接