Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何将计算结果四舍五入到小数点后n位_Java - Fatal编程技术网

在Java中如何将计算结果四舍五入到小数点后n位

在Java中如何将计算结果四舍五入到小数点后n位,java,Java,我可以看到有数百篇关于小数点后四舍五入的文章。然而,我已经到处搜索,似乎找不到与我的问题相匹配的前一个实例。 我对java还很陌生 我试图计算一行的斜率,将其分配给一个变量,并将该变量的内容格式化为小数点后4位 我尝试了DecimalFormat(似乎返回一个字符串,我需要一个可以在另一个计算阶段使用的数值) 我尝试过BigDecimal(似乎不知道如何构造它和设置刻度)。 下面是我的代码: import java.math.BigDecimal; public class Scratch

我可以看到有数百篇关于小数点后四舍五入的文章。然而,我已经到处搜索,似乎找不到与我的问题相匹配的前一个实例。 我对java还很陌生

我试图计算一行的斜率,将其分配给一个变量,并将该变量的内容格式化为小数点后4位

我尝试了DecimalFormat(似乎返回一个字符串,我需要一个可以在另一个计算阶段使用的数值) 我尝试过BigDecimal(似乎不知道如何构造它和设置刻度)。
下面是我的代码:

import java.math.BigDecimal;


public class Scratch {
    public static void main(String[] args) throws Exception {
        BigDecimal slope1, slope2, slope3;

        slope1 = new BigDecimal((8 - 8) / (20 - 5));
        slope2 = new BigDecimal((9 - 8) / (22 - 5));
        slope3 = new BigDecimal((9 - 8) / (22 - 20));
        slope1 = slope1.setScale(4);
        slope2 = slope1.setScale(4);
        slope3 = slope1.setScale(4);
        System.out.println(slope1);
        System.out.println(slope2);
        System.out.println(slope3);



    }


}
结果是:

0.0000
0.0000
0.0000
如何构建大数据对象,设置其规模,并以将实际计算结果保留到小数点后4位而不是0.0000位的方式进行计算


任何帮助都将不胜感激。我已经花了好几个小时来处理这个问题。

这里真正的问题是整数算术

(9-8)/(20-5)
等于
1/15
,在int算术中等于
0

为了得到正确的结果,您必须通过使至少一个数字
加倍来执行双重算术:


((双精度)(9-8)/(20-5))
((9.0-8)/(20-5))

这里真正的问题是整数算术

(9-8)/(20-5)
等于
1/15
,在int算术中等于
0

为了得到正确的结果,您必须通过使至少一个数字
加倍来执行双重算术:

((双倍)(9-8)/(20-5))
((9.0-8)/(20-5))
slope1=新的大十进制((8-8)/(20-5))
slope1=新的BigDecimal(((双精度)8-8)/((双精度)20-5))

更改
slope1=新的大十进制((8-8)/(20-5))
slope1=新的BigDecimal(((双精度)8-8)/((双精度)20-5))

整数算术是所有整数

    slope1 = new BigDecimal((8d - 8d) / (20d - 5d));
    slope2 = new BigDecimal((9d - 8d) / (22d - 5d));
    slope3 = new BigDecimal((9d - 8d) / (22d - 20d));
要使代码正常工作,请将d追加为double。基本上,所有的数字都被认为是整数,执行整数映射会产生神奇的效果,比如9/8计算为1。其他选择包括使用小数强制转换或将组合值转换为两倍

    slope2 = new BigDecimal((9.0 - 8.0) / (22.0 - 5.0));


整数运算就是所有的整数

    slope1 = new BigDecimal((8d - 8d) / (20d - 5d));
    slope2 = new BigDecimal((9d - 8d) / (22d - 5d));
    slope3 = new BigDecimal((9d - 8d) / (22d - 20d));
要使代码正常工作,请将d追加为double。基本上,所有的数字都被认为是整数,执行整数映射会产生神奇的效果,比如9/8计算为1。其他选择包括使用小数强制转换或将组合值转换为两倍

    slope2 = new BigDecimal((9.0 - 8.0) / (22.0 - 5.0));


这里有两个问题

第一个是在
BigDecimal
s的构造函数中使用整数算术。 您可以通过将值强制转换为双倍来解决此问题

第二个问题是设置了三次
slope1
的比例,并忽略了
slope2
slope3
的值:

slope1 = slope1.setScale(4);
slope2 = slope1.setScale(4);  // should be slope2
slope3 = slope1.setScale(4);  // should be slope3
但是,当您修复此问题时,当您尝试计算
slope2
时,将出现
算术异常。无论何时使用
scale()
对数字进行四舍五入,都需要指定一个
RoundingMode
,以便它知道要如何进行四舍五入

试试这个:

    slope1 = new BigDecimal((double) (8 - 8) / (20 - 5));
    slope2 = new BigDecimal((double) (9 - 8) / (22 - 5));
    slope3 = new BigDecimal((double) (9 - 8) / (22 - 20));
    slope1 = slope1.setScale(4, RoundingMode.HALF_UP);
    slope2 = slope2.setScale(4, RoundingMode.HALF_UP);
    slope3 = slope3.setScale(4, RoundingMode.HALF_UP);
    System.out.println(slope1); // 0.0000
    System.out.println(slope2); // 0.0588
    System.out.println(slope3); // 0.5000

这里有两个问题

第一个是在
BigDecimal
s的构造函数中使用整数算术。 您可以通过将值强制转换为双倍来解决此问题

第二个问题是设置了三次
slope1
的比例,并忽略了
slope2
slope3
的值:

slope1 = slope1.setScale(4);
slope2 = slope1.setScale(4);  // should be slope2
slope3 = slope1.setScale(4);  // should be slope3
但是,当您修复此问题时,当您尝试计算
slope2
时,将出现
算术异常。无论何时使用
scale()
对数字进行四舍五入,都需要指定一个
RoundingMode
,以便它知道要如何进行四舍五入

试试这个:

    slope1 = new BigDecimal((double) (8 - 8) / (20 - 5));
    slope2 = new BigDecimal((double) (9 - 8) / (22 - 5));
    slope3 = new BigDecimal((double) (9 - 8) / (22 - 20));
    slope1 = slope1.setScale(4, RoundingMode.HALF_UP);
    slope2 = slope2.setScale(4, RoundingMode.HALF_UP);
    slope3 = slope3.setScale(4, RoundingMode.HALF_UP);
    System.out.println(slope1); // 0.0000
    System.out.println(slope2); // 0.0588
    System.out.println(slope3); // 0.5000

计算在数据到达大小数点之前完成。基本上你在做
slope3=newbigdecimal(0)你永远不会从slope1中得到除零以外的任何东西-因为分子(8-8)和其他分子一样是零-如前所述,你需要先将比率强制为双精度。计算是在数据达到bigdecimal之前完成的。基本上你在做
slope3=newbigdecimal(0)你永远不会从slope1中得到除了零以外的任何东西-因为分子(8-8)是零,对于其他的-正如前面提到的,你需要先将比率强制为双精度。非常感谢你回复我。我添加了您推荐的更改以及下面另一条评论中推荐的内容。它看起来很接近工作状态,但现在我遇到了一个错误“RoundingMode无法解析为变量”。我之前尝试过使用RoundingMode,但遇到了相同的问题,所以就放弃了它。我有import语句import java.math.BigDecimal;包含在我的代码中(在我前面的示例中没有显示)上面的类声明中。似乎我现在已经让它工作了。我在不调用大小数的情况下成功地做到了这一点。你的线索是在配方中加入双重类型铸造,这是一个突破。再次非常感谢你的建议。双斜率1=((双)(p2.y-p1.y)/(双)(p2.x-p1.x));双斜率2=((双)(p1.y-p.y)/(双)(p1.x-p.x));双斜率3=((双)(p2.y-p.y)/(双)(p2.x-p.x));非常感谢你回复我。我添加了您推荐的更改以及下面另一条评论中推荐的内容。它看起来很接近工作状态,但现在我遇到了一个错误“RoundingMode无法解析为变量”,我之前尝试过使用RoundingMode,但遇到了相同的错误