如何将双精度四舍五入到最接近的第 10 位
How to round a double to the nearest 10th place
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?有没有人有任何见识?
谢谢,
天空
如果这是 JS:
Math.round() 函数returns 将数字的值四舍五入为最接近的整数。
没关系,这就是我发现的有效方法。
public double hypotenuse()
{
double hypot = Math.hypot(leg, leg);
String str = String.format("%1.1f", hypot);
hypot = Double.valueOf(str);
return hypot;
}
关于您自己的回答,您不想将 A 类型的对象转换为 B 类型的对象,对其进行操作,然后再将其转换回 A 类型。如果您可以做任何其他事情,则不会。
以下执行您希望它执行的操作:
public double hypotenuse()
{
return Math.round(Math.hypot(leg, leg) * 10) / 10.0;
}
我不太清楚为什么。这需要深入研究它在汇编级别的编译结果。
真正的问题 是 Java 中的每个双精度数只有有限的位数来存储其小数部分。现实生活中有无数个可能的实数。您无法仅用 64 位来表示每个实数。这就是为什么您应该避免在要求数字准确的银行应用程序和软件中进行浮点计算。将几个双倍数相乘可能会在计算中引入相当大的误差范围。 See this explanation on another SO answer, which does a great job of explaining this further.
如果你真的需要它是准确的,使用BigDecimal
。
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?有没有人有任何见识?
谢谢,
天空
如果这是 JS:
Math.round() 函数returns 将数字的值四舍五入为最接近的整数。
没关系,这就是我发现的有效方法。
public double hypotenuse()
{
double hypot = Math.hypot(leg, leg);
String str = String.format("%1.1f", hypot);
hypot = Double.valueOf(str);
return hypot;
}
关于您自己的回答,您不想将 A 类型的对象转换为 B 类型的对象,对其进行操作,然后再将其转换回 A 类型。如果您可以做任何其他事情,则不会。
以下执行您希望它执行的操作:
public double hypotenuse()
{
return Math.round(Math.hypot(leg, leg) * 10) / 10.0;
}
我不太清楚为什么。这需要深入研究它在汇编级别的编译结果。
真正的问题 是 Java 中的每个双精度数只有有限的位数来存储其小数部分。现实生活中有无数个可能的实数。您无法仅用 64 位来表示每个实数。这就是为什么您应该避免在要求数字准确的银行应用程序和软件中进行浮点计算。将几个双倍数相乘可能会在计算中引入相当大的误差范围。 See this explanation on another SO answer, which does a great job of explaining this further.
如果你真的需要它是准确的,使用BigDecimal
。