A Double(Java)中的小数位数

Kar*_*arl 7 java rounding

在java中是否有任何内置函数告诉我double中有多少小数位.例如:

101.13 = 2
101.130 = 3
1.100 = 3
1.1 = 1
-3.2322 = 4 etc.
Run Code Online (Sandbox Code Playgroud)

如果需要,我很乐意首先转换为另一种类型,我已经考虑过转换为bigdecimal而没有运气.

And*_*anu 14

如果您将数字作为字符串传递,可以使用BigDecimal.scale():

BigDecimal a = new BigDecimal("1.31");
System.out.println(a.scale()); //prints 2
BigDecimal b = new BigDecimal("1.310");
System.out.println(b.scale()); //prints 3
Run Code Online (Sandbox Code Playgroud)

但是如果您已经将数字作为字符串,那么您可以使用正则表达式解析字符串以查看有多少位数:

String[] s = "1.31".split("\\.");
System.out.println(s[s.length - 1].length());
Run Code Online (Sandbox Code Playgroud)

使用BigDecimal可能有一个好处,它检查字符串是否实际上是一个数字; 使用字符串方法,你必须自己做.此外,如果您将数字设为双倍,则无法区分1.311.310(它们完全相同),就像其他人指出的那样.


Joa*_*uer 9

没有.

1.100和1.1是完全相同的值(它们在a中逐位表示相同double).

因此,你无法从a获得那种信息double.

你唯一可以做的是让被解析到同一所必需的十进制数的小数的最小位数double的值.这就像调用Double.toString()和检查有多少十进制数字一样简单.


S.L*_*ott 6

double 中的小数位数是 16。

64 位数字。52 位尾数。52 位大约是 16 位十进制数字。

请参阅http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html

double,其值包括 64 位 IEEE 754 浮点数。

http://en.wikipedia.org/wiki/IEEE_754-2008

  • @EJP:请仔细阅读 IEEE 标准。特别是,请阅读有效数中的隐式位。 (5认同)
  • @EJP:我认为 15.9 是“大约 16”。从您的评论看来,您认为 15.9 不是“大约 16”。如果你想声称 15.9 不是“大约 16”,那么你也错了,因为它也不是 15.9。维基百科说“17 位十进制数字”和 15.955 位数字。 (4认同)
  • 好吧,我们只是在这里狡辩,但它是 15.9545897701910000。到小数点后 16 位 ;-) (3认同)
  • 不,那是小数*位数*,这是错误的,它是 15.9。考虑“123456789012345”。十五位小数,零小数位。“12345678901234.5”。十五位小数,一位小数。等等。 (2认同)
  • @EJP:不。我们没有狡辩。你最初的评论很明确。“大约16是错误的”。然后你声称它是 15.9,这同样是错误的。在他看来你并没有狡辩。你似乎有一些重要的事情要说,并且你已经将这件重要的事情重复了四次。这不是狡辩。您需要在这个答案中添加一些**重要的**内容。大约 16 甚至不接近 15.955。 (2认同)