Java 为什么我的双打数学出了问题?

Java 为什么我的双打数学出了问题?,java,math,double,Java,Math,Double,这就是我创建q的方式 Double q = ((r * (i/5)) + y); 此时,其他变量的值为 r = 3.470694142992069E-5 i = 1 y = -116.30237535361584 但是 这个数学有问题吗?(爪哇) i不是双精度编码。整数分割楼层。任何乘以0的值都是0。试试看 Double q = ((r * ((double)i/5)) + y); 这是完整的代码 class Main { public static void main (

这就是我创建q的方式

Double q = ((r * (i/5)) + y);
此时,其他变量的值为

r = 3.470694142992069E-5
i = 1
y = -116.30237535361584
但是

这个数学有问题吗?(爪哇)


i
不是双精度编码。整数分割楼层。任何乘以0的值都是0。

试试看

Double q = ((r * ((double)i/5)) + y);
这是完整的代码

class Main
{
        public static void main (String[] args) throws java.lang.Exception
        {
                double r = 3.470694142992069E-5;
                int i = 1;
                double y = -116.30237535361584;
                Double q = ((r * ((double)i/5)) + y);
                System.out.println(q);

        }
}
输出: -116.30236841222755


如果
i
是一个整数(似乎是这样),那么
i/5
表达式将执行整数运算,结果为零。

浮点值是出了名的不精确。您显示的差异可以预期为双算术。如果您真的需要额外的精度,则是一个用于精确数学的开源Java库。

i和5都是整数,因此(i/5)部分计算为整数(0)。这就抵消了r的乘法,所以只剩下y的值。

也许你可以试试

Double q = ((r * i/5.0) + y);

使用的值在
double
的精度范围内。但是我刚刚将I改为double,同样链接到临时代码删除站点是个坏主意。这种联系几天后就会消失。。。你的答案将被打破。最好使用原语类型
double
而不是类
double
来获得简单的双值。谢谢你,今天我忘记了原语类型,习惯了在我的代码中,有很多事情要做
class Main
{
        public static void main (String[] args) throws java.lang.Exception
        {
                double r = 3.470694142992069E-5;
                int i = 1;
                double y = -116.30237535361584;
                Double q = ((r * ((double)i/5)) + y);
                System.out.println(q);

        }
}
Double q = ((r * i/5.0) + y);