public double hypotenuse()
{
//return Math.hypot(leg, leg); //returns 7.0710678118654755
//return 0.1 * Math.floor(Math.hypot(leg, leg) * 10); //returns 7.0
//return 0.1 * Math.ceil(Math.hypot(leg, leg) * 10); //returns 7.1000000000000005
return 0.1 * Math.round(Math.hypot(leg, leg) * 10); //returns 7.1000000000000005
}
我试图四舍五入到最接近的第10位,所以这个数字应该舍入到7.1。为什么这个方法适用于Math.floor而不适用于Math.round?有没有人有任何见解?
谢谢,
天空
答案 0 :(得分:0)
没关系,这是我发现的有效。
public double hypotenuse()
{
double hypot = Math.hypot(leg, leg);
String str = String.format("%1.1f", hypot);
hypot = Double.valueOf(str);
return hypot;
}
答案 1 :(得分:0)
关于你对自己的回答,你不想将类型A的对象转换为类型B,对它进行操作,然后将其转换回类型A.如果你可以做任何其他事情,则不会。
以下是您希望它做的事情:
public double hypotenuse()
{
return Math.round(Math.hypot(leg, leg) * 10) / 10.0;
}
我不完全确定原因。需要深入研究一下这在汇编级别编译的内容。
真正的问题是Java中的每个double只有有限数量的位来存储其小数部分。在现实生活中有无数可能的实数。没有办法只用64位表示每个实数。这就是为什么你应该避免银行应用程序和软件中的浮点计算,要求数字准确。将几个双精度相乘可以在计算中引入相当大的误差范围。 See this explanation on another SO answer, which does a great job of explaining this further.
如果您确实需要它,请使用BigDecimal
。
答案 2 :(得分:-1)
如果这是针对JS:
Math.round()函数返回舍入到最接近整数的数字的值。