首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.math.MathContext的使用

java.math.MathContext的使用
EN

Stack Overflow用户
提问于 2008-08-11 05:23:02
回答 5查看 86.4K关注 0票数 62

最近,我试着理解了java.math.MathContext的使用,但未能正确理解。它是否用于java.math.BigDecimal中的舍入。如果是的话,它为什么不舍入小数,但连尾数部分。

从API文档中,我了解到它遵循ANSI X3.274-1996ANSI X3.274-1996/AM 1-2000规范中指定的标准,但我没有让它们在线阅读。

如果你对此有任何想法,请告诉我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-08-11 06:06:48

@jatan

谢谢你的回答。这不足为奇。请您在MathContext方法的上下文中解释一下BigDecimal#round。

BigDecimal.round()与任何其他BigDecimal方法没有什么特别之处。在所有情况下,MathContext都指定有效位数和舍入技术。基本上,每个MathContext有两个部分。有精确性,也有RoundingMode

精度再次指定有效数字的数目。因此,如果您将123指定为一个数字,并要求获得2个有效数字,您将得到120。如果你从科学符号的角度来思考,可能会更清楚。

123在科学表示法中将是1.23e2。如果您只保留两个有效数字,那么您将得到1.2e2120。通过减少有效数字的数量,我们降低了可以指定数字的精度。

RoundingMode部分指定了我们应该如何处理丢失的精度。要重用该示例,如果您使用123作为数字,并要求2位有效数字,那么您的精度就降低了。使用RoundingMode of HALF_UP (默认模式),123将变成120。使用RoundingMode of CEILING,您将得到130

例如:

代码语言:javascript
复制
System.out.println(new BigDecimal("123.4",
                   new MathContext(4,RoundingMode.HALF_UP)));
System.out.println(new BigDecimal("123.4",
                   new MathContext(2,RoundingMode.HALF_UP)));
System.out.println(new BigDecimal("123.4",
                   new MathContext(2,RoundingMode.CEILING)));
System.out.println(new BigDecimal("123.4",
                   new MathContext(1,RoundingMode.CEILING)));

产出:

代码语言:javascript
复制
123.4
1.2E+2
1.3E+2
2E+2

您可以看到,精度和舍入模式都会影响输出。

票数 54
EN

Stack Overflow用户

发布于 2010-11-16 12:55:27

要舍入BigDecimal的小数部分,请查看BigDecimal.setScale(int newScale, int roundingMode)方法。

例如,在小数点后用三位数将一个数字改为两位数的数字,并将其舍入:

代码语言:javascript
复制
BigDecimal original = new BigDecimal("1.235");
BigDecimal scaled = original.setScale(2, BigDecimal.ROUND_HALF_UP);

结果是一个值为1.24的BigDecimal (因为有舍入规则)

票数 79
EN

Stack Overflow用户

发布于 2014-04-10 13:06:56

我想在这里补充几个例子。我没有在以前的答案中找到它们,但我发现它们对于那些可能误导有效数字小数位的人很有用。让我们假设,我们有这样的背景:

代码语言:javascript
复制
MathContext MATH_CTX = new MathContext(3, RoundingMode.HALF_UP);

对于此代码:

代码语言:javascript
复制
BigDecimal d1 = new BigDecimal(1234.4, MATH_CTX);
System.out.println(d1);

很明显,正如上面所说的,您的结果是1.23E+3。第一个有效数字是123..。

但在这种情况下:

代码语言:javascript
复制
BigDecimal d2 = new BigDecimal(0.000000454770054, MATH_CTX);
System.out.println(d2);

你的数字不会四舍五入到逗号之后的3位--对于某些人来说,这是不直观的,也是值得强调的。相反,它将四舍五入到前3位有效数字,在本例中为"4 5 4“。因此,上面的代码会导致4.55E-7,而不是某些人所期望的0.000

类似的例子:

代码语言:javascript
复制
BigDecimal d3 = new BigDecimal(0.001000045477, MATH_CTX);
 System.out.println(d3);  // 0.00100

BigDecimal d4 = new BigDecimal(0.200000477, MATH_CTX);
 System.out.println(d4);   // 0.200

BigDecimal d5 = new BigDecimal(0.000000004, MATH_CTX);
    System.out.println(d5); //4.00E-9

我希望这个明显但相关的例子会有帮助.

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档