Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找到BigDecimal中有效位数的简洁方法?_Java_Bigdecimal_Significant Digits - Fatal编程技术网

Java 找到BigDecimal中有效位数的简洁方法?

Java 找到BigDecimal中有效位数的简洁方法?,java,bigdecimal,significant-digits,Java,Bigdecimal,Significant Digits,我不想限制BigDecimal中的有效位数。我只想找到该数字的有效位数 有没有一种方法可以在不将数字转换为字符串并计算数字字符的情况下执行此操作?我相信您需要和的组合,如下所示: import java.math.*; public class Test { public static void main(String[] args) { test("5000"); // 4 test("5000.00"); // 4 t

我不想限制BigDecimal中的有效位数。我只想找到该数字的有效位数


有没有一种方法可以在不将数字转换为字符串并计算数字字符的情况下执行此操作?

我相信您需要和的组合,如下所示:

import java.math.*;

public class Test {

    public static void main(String[] args) {
        test("5000");      // 4
        test("5000.00");   // 4
        test("5000.12");   // 6
        test("35000");     // 5
        test("35000.00");  // 5
        test("35000.12");  // 7
        test("35000.120"); // 7
        test("0.0034");    // 2
        test("1.0034");    // 5
        test("1.00340");   // 5
    }


    private static void test(String input) {
        System.out.println(input + " => " +
            significantDigits(new BigDecimal(input)));
    }

    private static int significantDigits(BigDecimal input) {
        input = input.stripTrailingZeros();
        return input.scale() < 0
            ? input.precision() - input.scale()
            : input.precision(); 
    }
}
import java.math.*;
公开课考试{
公共静态void main(字符串[]args){
测试(“5000”);//4
测试(“5000.00”);//4
测试(“5000.12”);//6
测试(“35000”);//5
测试(“35000.00”);//5
测试(“35000.12”);//7
测试(“35000.120”);//7
测试(“0.0034”);//2
测试(“1.0034”);//5
测试(“1.00340”);//5
}
专用静态无效测试(字符串输入){
System.out.println(输入+“=>”+
有效数字(新的BigDecimal(输入));
}
专用静态int有效位数字(BigDecimal输入){
input=input.stripTrailingZeros();
返回input.scale()<0
?input.precision()-input.scale()
:input.precision();
}
}
需要调用
stripTrailingZeros
,否则
BigDecimal
完全可能以“非规范化”形式存储。例如,
new BigDecimal(5000)
的精度为4,而不是1

调用
scale()
用于处理规范化表单在小数点之前有尾随零,但在小数点之后没有尾随零的情况。在这种情况下,刻度将始终为负,并指示尾随零的数量


编辑:带有尾随零但没有小数点的情况本质上是不明确的——例如,“5000”没有明确的有效位数。上述代码将小数点前的所有尾随零视为有效。

以下对Jon答案的修改返回了我认为正确的结果:

private static int significantDigits(BigDecimal input) {
    return input.scale() <= 0
        ? input.precision() + input.stripTrailingZeros().scale()
        : input.precision();
}
private静态int有效位(BigDecimal输入){

return input.scale()Jon的答案在大多数情况下都是正确的,指数数除外:

private static int significantDigits(BigDecimal input) {
return input.scale() <= 0
    ? input.precision() + input.stripTrailingZeros().scale()
    : input.precision();
}
private静态int有效位(BigDecimal输入){

return input.scale()你是对的,仅仅
precision()
不是答案,但是
new BigDecimal(8.6)。precision()
以某种方式返回
50
,而
new BigDecimal(8.6)。stripTrailingZeroes().precision()
也返回
50
@rgetman:这是因为
new BigDecimal(8.6)
实际上不是8.6…它是距离
8.6
最近的
double
的精确值。如果你希望得到2,你应该使用
new BigDecimal(“8.6”)
。只需打印
new BigDecimal(8.6)
你就会明白我的意思。另一个问题是
new BigDecimal(“5000.0”)。stripTrailingZeros().precision()
返回1,但根据公认的定义,您希望它返回5(因为您不会将
.0
添加到数字的末尾,除非它是有效的)。此外,
“5000”
中的有效位数仍然不明确。请参阅“有效数字”在维基百科中。@ajb:啊,捕捉得很好。我本来希望那里的值是1,更多地用科学术语来考虑它(其中5000=5x10^3)。@Jon实际上,我试图限制有效数字的数量,以便将其放入mysql数据库中的十进制数(3,2)。但似乎即使我输入300,数据也超出了范围。有什么建议吗?