在JavaFX中,全局alpha似乎失去了精度



我正在尝试在JavaFX中添加淡入淡出效果,并尝试使用AnimationTimer和编辑全局Alpha来完成此操作。到目前为止,我有以下内容:

var fader = new AnimationTimer() {
@Override
public void handle(long now) {
var gc = getGraphicsContext2D();
if (gc.getGlobalAlpha() - 0.05 <= 0) {
gc.setGlobalAlpha(1.0);
paintEmpty();
stop();
} else {
gc.clearRect(0, 0, width, height);
gc.setGlobalAlpha(gc.getGlobalAlpha() - 0.01);

gc.setFill(Color.WHITE);
gc.fillRect(0, 0, width, height);
System.out.println(gc.getGlobalAlpha());
}
}
};
fader.start();

这是有效的,但会在打印语句的末尾和输出处产生蓝色尖峰,尽管它最初遵循预期趋势(即0.99,0.98,0.97,0.96(,但值突然变低,比如0.9299999999999999。我不明白为什么会发生这种事?

速度超过精度

浮点技术以精确性换取执行速度。

代码的简化版本。

double d = 1.0d ;
while ( d > 0.89d ) {
d = d - 0.01 ;
System.out.println( d ) ;
}

请在IdeOne.com上查看实时运行的代码。

0.99
0.98
0.97
0.96
0.95
0.94
0.9299999999999999
0.9199999999999999
0.9099999999999999
0.8999999999999999
0.8899999999999999

精确度超过速度

如果您更喜欢准确性而不是速度,请使用BigDecimal类。

注意我们是如何将字符串传递给构造函数而不是float/double基元的。

BigDecimal d = new BigDecimal( "1.0" );
BigDecimal limit = new BigDecimal( "0.89" );
BigDecimal decrement = new BigDecimal( "0.01" );
while ( d.compareTo( limit ) > 0 )
{
d = d.subtract( decrement );
System.out.println( d );
}

请在IdeOne.com上实时查看此代码。

0.99
0.98
0.97
0.96
0.95
0.94
0.93
0.92
0.91
0.90
0.89

最新更新