Java 如何停止将小小数取整

Java 如何停止将小小数取整,java,Java,我试图计算F的值,其中F=1/(1^(1/3))+1/(2^(1/3))+…+1/(600000000^(1/3)). 我使用以下类,但是每个F1、F2、F3和F4的输出返回15000000。仔细检查后,我发现每次将值添加到总和时,总和都会添加1。我怎样才能获得非常小的小数位数的精确值,而不是将其转换为1 import java.util.Date; public class Problem1 { public static void main(String[] args) thro

我试图计算F的值,其中F=1/(1^(1/3))+1/(2^(1/3))+…+1/(600000000^(1/3)). 我使用以下类,但是每个F1、F2、F3和F4的输出返回15000000。仔细检查后,我发现每次将值添加到总和时,总和都会添加1。我怎样才能获得非常小的小数位数的精确值,而不是将其转换为1

import java.util.Date;

public class Problem1 {

    public static void main(String[] args) throws InterruptedException{

        //start measuring time
        long begTime = new Date().getTime();

        //Measure execution time of following statements
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        MyThread t4 = new MyThread();

        t1.n1 = 1;
        t1.n2 = 150000000;

        t2.n1 = 150000001;
        t2.n2 = 300000000;

        t3.n1 = 300000001;
        t3.n2 = 450000000;

        t4.n1 = 450000001;
        t4.n2 = 600000000;

        t1.start();
        t2.start();
        t3.start();
        t4.start();

        t1.join();
        t2.join();
        t3.join();
        t4.join();

        System.out.printf("Value of F1 is %f\n", t1.sum);
        System.out.printf("Value of F2 is %f\n", t2.sum);
        System.out.printf("Value of F3 is %f\n", t3.sum);
        System.out.printf("Value of F4 is %f\n", t4.sum);
        System.out.println();

        System.out.printf("Value of F is %f\n", t1.sum+t2.sum+t3.sum+t4.sum);



        //Compute and print elapsed time
        double timeElapsed = (new Date().getTime() - begTime) * 0.001;
        System.out.printf("Time elapsed = %f secs\n", timeElapsed);

    }
}

public class MyThread extends Thread {

    int n1, n2;
    double sum = 0.0;

    public void run(){

        for (int i=n1; i<= n2;i++){
            sum = sum+ (1/(Math.pow((double) i, (double) (1/3))));


        }

    }

}
import java.util.Date;
公共类问题1{
公共静态void main(字符串[]args)引发InterruptedException{
//开始测量时间
long begTime=new Date().getTime();
//测量以下语句的执行时间
MyThread t1=新的MyThread();
MyThread t2=新的MyThread();
MyThread t3=新的MyThread();
MyThread t4=新的MyThread();
t1.n1=1;
t1.n2=15000000;
t2.n1=150000001;
t2.n2=300000000;
t3.n1=300000001;
t3.n2=450000000;
t4.n1=450000001;
t4.n2=600000000;
t1.start();
t2.start();
t3.start();
t4.开始();
t1.join();
t2.连接();
t3.join();
t4.join();
System.out.printf(“F1的值是%f\n”,t1.sum);
System.out.printf(“F2的值为%f\n”,t2.sum);
System.out.printf(“F3的值是%f\n”,t3.sum);
System.out.printf(“F4的值为%f\n”,t4.sum);
System.out.println();
System.out.printf(“F的值是%F\n”,t1.sum+t2.sum+t3.sum+t4.sum);
//计算并打印运行时间
双时间流逝=(新日期().getTime()-begTime)*0.001;
System.out.printf(“已用时间=%f秒\n”,已用时间);
}
}
公共类MyThread扩展线程{
int n1,n2;
双和=0.0;
公开募捐{

对于(inti=n1;i,可以使用BigDecimal而不是double。


这可能也有帮助。

您可以使用BigDecimal而不是double。


这可能也会有所帮助。

如果数字的类型不是问题,则应使用BigDecimal

它比double更强大,并且可以放入更多的小数,以及其他操作,如本机中的轮数

这条线索解释得更好


如果数字类型没有问题,则应使用BigDecimal

它比double更强大,并且可以放入更多的小数,以及其他操作,如本机中的轮数

这条线索解释得更好


如图所示,这是浮点和双精度的正常行为


考虑使用BigDecimal对象,因为它们对于精确的算术运算更强大。

这是float和double的正常行为


考虑使用BigDecimal对象,因为它们对于精确的算术运算更强大。

您应该快速查看一下System.out.println((双精度)(1/3))是什么
实际输出。
1
3
都是整数,因此
1/3
将始终返回int
0
。在这种情况下,在已经进行整数除法之后强制转换为double就太晚了。顺便说一句,对于经过的时间调用。或者使用。您应该快速查看一下
System.out.println((double)(1/3));
实际输出。
1
3
都是整数,因此
1/3
将始终返回int
0
。在这种情况下,在进行整数除法后强制转换为double会很晚。顺便说一句,对于经过的时间调用。或者使用。