chr*_*tek 1 java floating-point double integer
标题是不言自明的。从 Java 双精度数中获取位数的好方法是什么,最好只使用数学?
123 => 0
1.12 => 2
1.0001 => 4
2.340000 => 2
0.10 => 1
Run Code Online (Sandbox Code Playgroud)
例如,我有一个双 d = 0.320。
据我所知,对于编译器/jvm/计算机:
System.out.println(0.0100000 == 0.01); // prints true...
Run Code Online (Sandbox Code Playgroud)
这应该得到 dec 之后的金额:
Double d = 123.9343;
String[] div = d.toString().split("\\.");
div[0].length(); // Before Decimal Count
div[1].length(); // After Decimal Count
Run Code Online (Sandbox Code Playgroud)
说明:首先将双精度数转换为字符串,然后使用该split
函数将字符串拆分为.
两部分,然后您可以使用该函数轻松找到字符串的长度length
。
简短版本:使用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());
}
Run Code Online (Sandbox Code Playgroud)
输出:
1.8E-9 --> 10
123 --> 0
1.12 --> 2
1.0001 --> 4
2.34 --> 2
0.1 --> 1
Run Code Online (Sandbox Code Playgroud)
需要注意的是实例BigDecimal
从double
这样最终会给予你意想不到的结果。考虑scale()
的BigDecimal.valueOf(0.1 + 0.1 + 0.1)
,这是17
。这是因为0.1
(以及范围内大多数其他约 97% 的数字)不能由 精确表示double
,这会在计算中引入舍入误差。
另请注意,scale()
在涉及操作结果的解决方案中使用函数toString()
会失败。Double.toString()
是明确定义的,并且可以产生超出人们可能认为的double
.