最近,我试着理解了java.math.MathContext的使用,但未能正确理解。它是否用于java.math.BigDecimal中的舍入。如果是的话,它为什么不舍入小数,但连尾数部分。
从API文档中,我了解到它遵循ANSI X3.274-1996和ANSI X3.274-1996/AM 1-2000规范中指定的标准,但我没有让它们在线阅读。
如果你对此有任何想法,请告诉我。
发布于 2008-08-11 06:06:48
@jatan
谢谢你的回答。这不足为奇。请您在MathContext方法的上下文中解释一下BigDecimal#round。
BigDecimal.round()与任何其他BigDecimal方法没有什么特别之处。在所有情况下,MathContext都指定有效位数和舍入技术。基本上,每个MathContext有两个部分。有精确性,也有RoundingMode。
精度再次指定有效数字的数目。因此,如果您将123指定为一个数字,并要求获得2个有效数字,您将得到120。如果你从科学符号的角度来思考,可能会更清楚。
123在科学表示法中将是1.23e2。如果您只保留两个有效数字,那么您将得到1.2e2或120。通过减少有效数字的数量,我们降低了可以指定数字的精度。
RoundingMode部分指定了我们应该如何处理丢失的精度。要重用该示例,如果您使用123作为数字,并要求2位有效数字,那么您的精度就降低了。使用RoundingMode of HALF_UP (默认模式),123将变成120。使用RoundingMode of CEILING,您将得到130。
例如:
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)));产出:
123.4
1.2E+2
1.3E+2
2E+2您可以看到,精度和舍入模式都会影响输出。
发布于 2010-11-16 12:55:27
要舍入BigDecimal的小数部分,请查看BigDecimal.setScale(int newScale, int roundingMode)方法。
例如,在小数点后用三位数将一个数字改为两位数的数字,并将其舍入:
BigDecimal original = new BigDecimal("1.235");
BigDecimal scaled = original.setScale(2, BigDecimal.ROUND_HALF_UP);结果是一个值为1.24的BigDecimal (因为有舍入规则)
发布于 2014-04-10 13:06:56
我想在这里补充几个例子。我没有在以前的答案中找到它们,但我发现它们对于那些可能误导有效数字和小数位的人很有用。让我们假设,我们有这样的背景:
MathContext MATH_CTX = new MathContext(3, RoundingMode.HALF_UP);对于此代码:
BigDecimal d1 = new BigDecimal(1234.4, MATH_CTX);
System.out.println(d1);很明显,正如上面所说的,您的结果是1.23E+3。第一个有效数字是123..。
但在这种情况下:
BigDecimal d2 = new BigDecimal(0.000000454770054, MATH_CTX);
System.out.println(d2);你的数字不会四舍五入到逗号之后的3位--对于某些人来说,这是不直观的,也是值得强调的。相反,它将四舍五入到前3位有效数字,在本例中为"4 5 4“。因此,上面的代码会导致4.55E-7,而不是某些人所期望的0.000。
类似的例子:
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我希望这个明显但相关的例子会有帮助.
https://stackoverflow.com/questions/7539
复制相似问题