如何从Java中的double获取十进制数字的数量?(例如:2.34 => 2、2.340 => 2、0.921 => 3)

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)

Jay*_*Jay 6

这应该得到 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

  • 你必须小心科学记数法,不是吗?例如:9E-1? (3认同)

jdp*_*nix 5

简短版本:使用BigDecimal和它的scale()方法。随心所欲地初始化。

长版:

您特别提到您更喜欢您使用的解决方案

  • “仅数学”(模棱两可但我能猜到你的意思)
  • 从 a 中获取位数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)

需要注意的是实例BigDecimaldouble这样最终会给予你意想不到的结果。考虑scale()BigDecimal.valueOf(0.1 + 0.1 + 0.1),这是17。这是因为0.1(以及范围内大多数其他约 97% 的数字)不能由 精确表示double,这会在计算中引入舍入误差。

另请注意,scale()在涉及操作结果的解决方案中使用函数toString()会失败。Double.toString()是明确定义的,并且可以产生超出人们可能认为的double.