Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX进度指示器添加神秘的额外值?_Java_Javafx - Fatal编程技术网

JavaFX进度指示器添加神秘的额外值?

JavaFX进度指示器添加神秘的额外值?,java,javafx,Java,Javafx,我正在测试javaFX中进度条/指示器的功能,当我向指示器添加特定值时,它会显示一种奇怪而意外的行为 public class RunningController { public ProgressIndicator progressCircle; //This Adds value to the progress indicator private double addProgess(){ double newProgress, currentPro

我正在测试javaFX中进度条/指示器的功能,当我向指示器添加特定值时,它会显示一种奇怪而意外的行为

public class RunningController {

    public ProgressIndicator progressCircle;

    //This Adds value to the progress indicator
    private double addProgess(){
        double newProgress, currentProgress;
        currentProgress = progressCircle.getProgress();
        System.out.println("Current Process "+ currentProgress);
        newProgress = currentProgress + 0.1;
        System.out.println("New Progress " + newProgress);
        return newProgress;
    }

    //This is tied to a single button press to update the indicator
    public void progressCircleMethod(ActionEvent actionEvent) {
        checkProgress();
    }

    //This checks the value of the progress indicator and adds if required
    private void checkProgress() {
        if (progressCircle.getProgress() < 1){
            progressCircle.setProgress(addProgess());
        } else {
            System.out.println("Complete");
        }
    }
}
显然,我希望在10次印刷中达到100%,而不是11次
为什么在按钮按下(3)和(8)时会添加这些额外的十进制值

编辑:完全忘记了双打的四舍五入问题。我可以使用公认的答案或使用
BigDecimal
。使用
BigDecimal

private double addProgess(){
    double currentProgress = progressCircle.getProgress();
    BigDecimal currentProgressValue;
    BigDecimal newProgressValue;

    currentProgressValue = BigDecimal.valueOf(currentProgress);
    System.out.println("Current Progress " + currentProgressValue);
    newProgressValue = currentProgressValue.add(BigDecimal.valueOf(0.1d));
    System.out.println("New Progress " + newProgressValue);
    return newProgressValue.doubleValue();
}

实际上,在10次按键操作中,您实际上达到了100%,只是浮点数字的不准确导致它是
.999999
而不是
1

有关为什么浮点数字会导致这样的精度损失(“舍入错误”)的更多信息,请参阅


解决此问题的一个简单方法是使用
double
来跟踪0到1之间的进度百分比,而不是使用
int
来跟踪0到100之间的进度。整数不会像
double
s这样的浮点类型那样出现精度问题。如果您需要在该函数之外的函数中使用期望值介于0和1之间的进度数,则始终可以将
int
转换为
双精度
,并在该点将其除以100。

您实际上在10次按下按钮后达到了100%的效果,正是由于浮点数的不准确,才导致它是
.999999
而不是
1

有关为什么浮点数字会导致这样的精度损失(“舍入错误”)的更多信息,请参阅


解决此问题的一个简单方法是使用
double
来跟踪0到1之间的进度百分比,而不是使用
int
来跟踪0到100之间的进度。整数不会像
double
s这样的浮点类型那样出现精度问题。如果您需要在该函数之外的函数中使用期望值介于0和1之间的进度数,则始终可以将
int
转换为
双精度
,并在该点将其除以100。

您实际上在10次按下按钮后达到了100%的效果,正是由于浮点数的不准确,才导致它是
.999999
而不是
1

有关为什么浮点数字会导致这样的精度损失(“舍入错误”)的更多信息,请参阅


解决此问题的一个简单方法是使用
double
来跟踪0到1之间的进度百分比,而不是使用
int
来跟踪0到100之间的进度。整数不会像
double
s这样的浮点类型那样出现精度问题。如果您需要在该函数之外的函数中使用期望值介于0和1之间的进度数,则始终可以将
int
转换为
双精度
,并在该点将其除以100。

您实际上在10次按下按钮后达到了100%的效果,正是由于浮点数的不准确,才导致它是
.999999
而不是
1

有关为什么浮点数字会导致这样的精度损失(“舍入错误”)的更多信息,请参阅

解决此问题的一个简单方法是使用
double
来跟踪0到1之间的进度百分比,而不是使用
int
来跟踪0到100之间的进度。整数不会像
double
s这样的浮点类型那样出现精度问题。如果您需要在该函数之外的函数中使用进度号,该函数期望值介于0和1之间,则始终可以将
int
转换为
double
,并在该点将其除以100。

private double addProgess(){
    double currentProgress = progressCircle.getProgress();
    BigDecimal currentProgressValue;
    BigDecimal newProgressValue;

    currentProgressValue = BigDecimal.valueOf(currentProgress);
    System.out.println("Current Progress " + currentProgressValue);
    newProgressValue = currentProgressValue.add(BigDecimal.valueOf(0.1d));
    System.out.println("New Progress " + newProgressValue);
    return newProgressValue.doubleValue();
}