- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不想限制 BigDecimal 中有效数字的数量。我只想找到该数字的有效数字位数。
有没有办法不用将数字转换为字符串并计算数字字符就可以做到这一点?
最佳答案
我相信你想要 stripTrailingZeros
的组合, precision
和 scale
,如此处所示:
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 中查找有效数字位数的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443740/
如何在 C++ 中进行涉及有效数字的数学运算?我希望它能正确处理化学和物理实验的测量数据。一个例子:65/5 = 10。我需要去掉不需要的小数位并将一些数字替换为 0。 谢谢! 最佳答案 这应该可以满
这个任务看起来很简单 - 在输入时我得到测试数量 (numOfTests),然后是两个数字 (downBorder, upBorder) 和我必须找出这些数字(downBorder、upBorder)
如果我有 double (234.004223) 等,我想在 C# 中将其四舍五入为 x 位有效数字。 到目前为止,我只能找到舍入到 x 位小数的方法,但是如果数字中有任何 0,这只会删除精度。 例如
我是一名优秀的程序员,十分优秀!