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