我想要做的是将浮点数舍入到N个小数位的方法(N将在stdin中给出),用它做一些数学运算然后打印结果。我发现了这个:
public BigDecimal round(float number, int decimal){
BigDecimal obj = new BigDecimal(number).setScale(decimal, BigDecimal.ROUND_HALF_UP);
return obj;
哪种方法效果很好,但是当数字N(此方法中的小数为十进制)很高时则不行。例如:x = -10,y = -11.8814,N = 8,它打印出来:
-10.00000000 + -11.88140011 = -21.88140106
这就是我想要的:
-10.00000000 + -11.88140000 = -21.88140000
感谢大家的建议:)
答案 0 :(得分:2)
我认为最简单的方法是将你的数字乘以10 ^ N并使用round()将它们变成整数。运行数学,然后将它们分开
public static void main(String[] args) {
double a = -10.0;
double b = -11.88140011;
int n = 4;
long total = round(a, n) + round(b, n);
System.out.println(String.format("%.8f%n", total * Math.pow(10, -1*n)));
}
static Long round(double number, int decimal) {
return Math.round(number * Math.pow(10, decimal));
}
答案 1 :(得分:1)
没有float
表示11.88140000并且所有8位小数都保持不变,所以当你将该数字传递给你的方法时,无论实现如何,它都没有机会返回想要的结果,请参阅{{3 }}:
...总精度为24位(相当于log10(224)≈71225十进制数字)
并且该精度包括所有数字,而不仅仅是小数分隔符之后的数字。
答案 2 :(得分:0)
你的问题已经有了答案,但为了更好地理解浮动与小数的问题,还有另一个post关于问题的深入解释(对每种编程语言都相同):
只是为了完整性:0.3将完全存储在BigDecimal中。在float中(由于它的二进制特性),它将存储为0.30000001192092896。使用float实例化BigDecimal并直接解决此问题。
答案 3 :(得分:0)
所以,这是答案。我没有使用 round 功能我只打印了带有结果的数字:
System.out.printf("%." + n + "f + %." + n + "f = %." + n + "f\n", a, b, a + b);
在我发布这个问题之前我尝试过,但是我使用了float并且尝试使用double(使用函数 nextDouble()进行扫描)。所以,双重就是答案。
感谢您的建议! :))