当前位置: 首页 > 知识库问答 >
问题:

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

葛海阳
2023-03-14

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

有没有一种方法可以在不将数字转换为字符串并计算数字字符的情况下实现这一点?

共有3个答案

彭正谊
2023-03-14

乔恩的答案在大多数情况下都是正确的,除了指数数:

private static int significantDigits(BigDecimal input) {
return input.scale() <= 0
    ? input.precision() + input.stripTrailingZeros().scale()
    : input.precision();
}

假设输入为1.230000E17,函数返回18,但正确的有效数字应为7。

颜镜
2023-03-14

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

private static int significantDigits(BigDecimal input) {
    return input.scale() <= 0
        ? input.precision() + input.stripTrailingZeros().scale()
        : input.precision();
}

(请注意,input.stripTrailingZeros()。scale()在这些测试中似乎总是负值。)

此外,正如我在上面提到的,BigDecimal无法区分,例如,带有一个有效数字的“5000”和带有两个有效数字的“5000”。此外,根据定义,“5000”(后面有一个小数点)应该正好有四个有效数字,但BigDecimal无法处理。(见http://en.wikipedia.org/wiki/Significant_figures对于我使用的定义。)

苏彦君
2023-03-14

我相信您想要的是条带跟踪零精度比例的组合,如下所示:

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(); 
    }
}

需要调用stripTrailingZeros,否则BigDecimal完全可能以“非规范化”形式存储。例如,new BigDecimal(5000)的精度是4,而不是1。

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

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

 类似资料:
  • 问题内容: 在Java中,我试图找到一种有效的方法来根据条件将BigDecimal舍入为两位小数,即Up或Down。 最有效的方法是什么? 问题答案:

  • 这个问题已经过时了。删除了不推荐使用的标志,3.8确认了这一点。

  • 我有一个多索引df,带有“海龟”列 我需要的是“网络Pos”。我想不出一个优雅的方法。我需要的是使用Numpy或熊猫的colNet位置。数据集很大,需要使用递归并避免崩溃。 6将被分为6次1 1 1 1 1 1 1 第一个1将乘以基本数量,因此为1*2 第二个1将与第一个1的结果乘以海龟系数2*3 第四个1将与第三个1计算的结果相乘,乘以18*3以上的海龟因子,以此类推,最后求和,得到第一行的结果

  • 问题内容: 下面的代码检查和是不同的值(变量,,只能有值,或),并且如果是这样,套到第三个字符: 能否以更简洁,可读和有效的方式做到这一点? 问题答案: 我假设您的代码中的三种情况之一成立。在这种情况下,该集合将由单个元素组成,由返回。 编辑: 正如Raymond Hettinger在评论中所建议的那样,您还可以使用元组拆包从集合中提取单个元素:

  • 问题内容: 例如,我目前正在这样做: 你能打败这个吗? 问题答案:

  • 我找不到任何关于数学交换和堆栈溢出的问题来回答这个特定问题。这是我发现的最相似的问题,但这个问题构造得太差,答案完全不充分。 我尝试过在谷歌上寻找无济于事。我确实发现了这一点,但这个公式似乎效率低下,因此不够。例如,如果我们取数字21... 现在想象一下找到远大于21的数字的共同因素,例如2,252和4,082...上述方法没有任何效率。 我想做的是找出最有效的方法来找到任何两个数字的所有公因数。