首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何使一个数字慢慢回到零

我如何使一个数字慢慢回到零
EN

Stack Overflow用户
提问于 2015-09-14 16:10:19
回答 3查看 271关注 0票数 2

让我进一步解释我的问题。假设我的速度是-5.4028000,我希望它能像这样回到零。

代码语言:javascript
复制
-5.4,
-5.3,
-5.2
... 
-0.2,
-0.1,
0

正数也一样。每运行一次,它们就会返回到0。因为这将放在更新循环中。

我尝试过的事情:

代码语言:javascript
复制
if(vx > 0)
{
    vx-=0.1;
}
if(vx < 0)
{
    vx+=0.1;
}

但这只会把我的VX锁在:

VX:0.04999999

VX:0.09999999

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-14 16:17:29

您的数字没有返回到零的原因是最后一次减法可能是由于舍入错误而减去了错误的数字。因为无论是5.4还是0.1都不能精确地表示为double格式,所以您的最后一个减法(或在负数情况下的最后一个加法)将“超调”。

这对于Math.min(...)Math.max(...)来说是个问题。基本上,我们只会加或减去我们需要达到零的确切数量。

代码语言:javascript
复制
if (vx > 0) {
    vx -= Math.min(0.1, vx);
}
if (vx < 0) {
    vx += Math.min(0.1, -vx);
}
票数 4
EN

Stack Overflow用户

发布于 2015-09-14 16:19:40

您需要确保最后的增量/减少不大于数字的大小:

代码语言:javascript
复制
if(vx > 0) {
    vx -= Math.min(0.1, vx);
}
if(vx < 0) {
    vx += Math.min(0.1, Math.abs(vx));
}
票数 0
EN

Stack Overflow用户

发布于 2015-09-14 16:23:25

假设您希望每秒的变化率为0.1,并且不使用任何花哨的库,那么您可以这样做:

代码语言:javascript
复制
while (Math.abs(vx) - 0.1 > 0.0) {
    vx += -Math.signum(vx) * 0.1
    Thread.sleep(1000)
}
vx = 0.0;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32569248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档