标题不言自明。什么是好的方法,最好只用数学来获得Java的数字位数?
123 => 0
1.12 => 2
1.0001 => 4
2.340000 => 2
0.10 => 1
我有一个双d = 0.320例如。
据我所知,对于compiler / jvm / computer:
System.out.println(0.0100000 == 0.01); // prints true...
答案 0 :(得分:4)
这应该在dec之后得到金额:
Double d = 123.9343;
String[] div = d.toString().split("\\.");
div[0].length(); // Before Decimal Count
div[1].length(); // After Decimal Count
说明 :您首先将双精简版转换为字符串并使用split
函数将字符串从.
一旦它成2件,您就可以使用length
函数轻松找到字符串的长度。
答案 1 :(得分:2)
您需要使用指定精度的BigDecimal
类。其他一切都只是一个黑客。
This is required reading as a computer scientist,你必须阅读它才能理解为什么你的问题如此破碎。
答案 2 :(得分:2)
简短版本:使用BigDecimal
及其scale()
方法。无论如何都要初始化。
长版:
您特别提到您更喜欢使用的解决方案
double
的位数,可能是小数部分(基于您的预期输出)以下是使用java.math.BigDecimal
执行此操作的解决方案:
List<BigDecimal> list = new ArrayList<BigDecimal>() {{
add(BigDecimal.valueOf(0.0000000018));
add(BigDecimal.valueOf(123));
add(BigDecimal.valueOf(1.12));
add(BigDecimal.valueOf(1.0001));
add(BigDecimal.valueOf(2.340000));
add(BigDecimal.valueOf(0.10));
}};
for (BigDecimal bd : list) {
System.out.println(bd + " --> " + bd.scale());
}
输出:
1.8E-9 --> 10
123 --> 0
1.12 --> 2
1.0001 --> 4
2.34 --> 2
0.1 --> 1
请注意,像这样从BigDecimal
实例化double
最终会给您带来惊人的结果。考虑scale()
的{{1}},即BigDecimal.valueOf(0.1 + 0.1 + 0.1)
。这是因为17
(以及范围内大多数其他~97%的数字)无法由0.1
精确表示,这会在计算中引入舍入误差。
另请注意,使用double
函数,其中涉及操纵scale()
结果的解决方案将失败。 Double.toString()
定义明确,并且可以产生超出人们可能认为的toString()
的“十进制符号”的一系列输出。
答案 3 :(得分:0)
没有任何有用的概念&#34; Java double
&#34;的数字位数。与您给出的结果一致。 double
是二进制浮点数,而不是十进制浮点数,例如,Java double
1.12实际上是数字1.12000000000000010658141036401502788066864013671875
,后面有50位数字所有重复零之前的小数点。
答案 4 :(得分:0)
double中的小数位数是15.9。期间。(我会让你弄清楚如何对待0.9。)
如果你有一个浮点数1.00000000000001,你不知道(没有进一步的信息)&#34; 1&#34;在这个数字的右端是&#34;信息&#34;或&#34;噪音&#34;。与0.9999999999999类似 - 它真的是1.0,还是那些9都很重要? 你不知道没有关于计算/测量精度的一些信息,而不是产生数字。
通常将数字格式化为N位数,然后&#34; trim&#34;右边是零(或者,有四舍五入,9s)的字符串,但这最多只是一个受过教育的赌注。在最坏的情况下,它会丢弃关键数据。
答案 5 :(得分:-2)
我不会给你代码,只是方法。一种方法是将数字打印到字符串中,然后在该字符串上使用正则表达式。获取小数点后的字符串部分并计算数字,直到达到0.有角落的情况,但你可以照顾它。但有一点,有些数字无法准确表示,例如4/3,所以理论上小数位数是无限的。但是如果你打印成一个字符串,你就会限制小数位数,这样可以很容易计算。只要知道,如果你限制在N个小数位并且你的计数器返回N,那么它是否正好是N个小数位或无穷大有一点疑问。如果你在实施这种方法时遇到困难,请告诉我你得到了什么以及你遇到了什么,我可以帮助你。