【问题标题】:Number of decimal digits in a double [closed]双精度数中的小数位数[关闭]
【发布时间】:2011-06-07 11:35:23
【问题描述】:

如何确定Java中234.12413等数字中的整数位数和小数位数。

【问题讨论】:

  • 对于应用程序的哪些可能特性,程序需要知道这些吗?当然,更多的是显示DoubleFloat 以仅显示一定的精度限制。例如。 '12.158384' -> '12.16', '3.33333..' -> '3.33'.
  • 双精度中没有小数位。有二进制数字。
  • 另一种看待它的方式:在 Intel 平台的硬件级别上,double 是一个 52 位整数。并且有一个 11 位数字可以告诉您将小数点放在哪里。还有一个符号位。
  • 相比于强制转换字符串,我想推荐这个。 BigDecimal 值 = BigDecimal.valueOf(); int decimalCount = Math.max(0, value .scale());

标签: java double


【解决方案1】:

double 并不总是精确的表示。你只能说如果你把它转换成一个字符串你会有多少个小数位。

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

这仅适用于未转换为指数符号的数字。您可能会认为 1.0 有一位或没有小数位。

【讨论】:

  • 当指数出现时,BigDecimal 更有用。无论如何都是好例子,所以 +1
  • 这个方法最终会失败,因为转换 toString() 使用操作系统的小数分隔符,并非所有操作系统都使用点 . 作为小数分隔符,而您使用的是文字点,因此它将仅在某些环境和某些情况下工作。更好的方法是使用:new DecimalFormat("#.#########").format(Math.abs(value)).replace(",",".") 以确保您的 text 变量始终接收文字点。
  • 此外,它不适用于以零结尾的大数字,因为 10000000 表示为 1.0E7 等。因此 result[0] = 1 和 result[1] = 3。DecimalFormat 会有所帮助。同样的问题有toString()"" + doubleValue的其他解决方案
  • 这是一个不错的答案,但它不可靠,因为它不适用于任何双精度。我能够通过循环十次方并检查dbl * pow(10, i) % 1 == 0 是否为真,使用数学来解决这个答案。如果该陈述为真,那么小数位数为i。在方法开头添加if 以检查double 是否没有小数:if(dbl == (int)dbl) {return 0;} 完成该方法。
  • 如 Fenix 所说,您的解决方案的反例是 10,000,000。 Double.toString(10000000) 返回1.0E7。但是,如果您通过我的方法运行这个数字,那么10000000.0D * Math.pow(10, 0) % 1 == 0 将为真,并且该函数将返回 0。不幸的是,每个注释没有足够的字符来适应该方法的完整实现。 (我修改了方法,所以顶部不再有 if 语句)。
【解决方案2】:
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,大写Double
  • decimalno=dstring.length()-(dstring.indexOf(".")+1);
  • 如果\\. 正则表达式不起作用,请尝试[.]。它确实对我有用
【解决方案3】:
    String s = "" + 234.12413;
    String[] result = s.split("\\.");
    System.out.println(result[0].length() + " " + result[1].length());

【讨论】:

    【解决方案4】:

    1) 转换为字符串

    2) '.' 的子字符串结束

    3) 得到这个子串的长度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2011-01-22
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多